diff options
author | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-04-11 09:05:45 +0000 |
---|---|---|
committer | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-04-11 09:05:45 +0000 |
commit | 825f3691fae26d3cc54dc04b4a559d197c46f780 (patch) | |
tree | 85ec520f743d57148ca2bd9b5c777832e4281e1e /src | |
parent | 74a967da857ead23ec5d976c6616ac98fb7c33ef (diff) | |
download | scala-825f3691fae26d3cc54dc04b4a559d197c46f780.tar.gz scala-825f3691fae26d3cc54dc04b4a559d197c46f780.tar.bz2 scala-825f3691fae26d3cc54dc04b4a559d197c46f780.zip |
Merged revisions 24573,24583-24584,24592-24604,...
Merged revisions
24573,24583-24584,24592-24604,24607-24612,24614-24646,24648,24651-24667,
24672-24706,24708-24717,24719-24724 via svnmerge from
https://lampsvn.epfl.ch/svn-repos/scala/scala/trunk
........
r24573 | dragos | 2011-03-24 18:48:14 +0100 (Thu, 24 Mar 2011) | 1 line
Added synchronous version of askStructure, needed by the IDE to avoid
deadlocks. review by odersky. ........ r24583 | magarcia | 2011-03-25
15:40:35 +0100 (Fri, 25 Mar 2011) | 3 lines
for Scala.NET bootstrapping. Given that flatten does not run in
forMSIL mode, there may be several recursive activations of the case
clause, and part of that activation state needs to be saved/restored.
forJVM behavior remains unchanged.
........
r24584 | extempore | 2011-03-25 15:49:31 +0100 (Fri, 25 Mar 2011) | 5 lines
I guess windows can show a < 500x difference and still give us
confidence there isn't a 100,000x difference. Testing situation
continues to confound and amaze. Trying to make 4279 not fail on
windows, one more time and I will delete it and burn the bodies. No
review. ........ r24592 | extempore | 2011-03-25 22:13:52 +0100 (Fri, 25
Mar 2011) | 3 lines
Figured out why -Ydebug has been such a deathtrap for a while. I'm
the culprit. Making -Ydebug less likely to kill a compile, no review.
........ r24593 | extempore | 2011-03-25 22:21:27 +0100 (Fri, 25 Mar
2011) | 2 lines
Fixed the "poor resilience to error conditions" crasher mentioned in
#3625, no review. ........ r24594 | kzys | 2011-03-25 23:55:19 +0100
(Fri, 25 Mar 2011) | 2 lines
[scaladoc] Stop wiki syntax parsing inside HTML. Review by pedrofurla.
........ r24595 | kzys | 2011-03-26 00:08:19 +0100 (Sat, 26 Mar 2011) |
2 lines
[scaladoc] Add a test for #4180. No review.
........
r24596 | kzys | 2011-03-26 01:39:35 +0100 (Sat, 26 Mar 2011) | 2 lines
[scaladoc] Fix wiki formatting to close #4359. Review by malayeri.
........ r24597 | kzys | 2011-03-26 02:25:13 +0100 (Sat, 26 Mar 2011) |
2 lines
[scaladoc] Closes #4371. Review by pedrofurla.
........
r24598 | kzys | 2011-03-26 04:26:40 +0100 (Sat, 26 Mar 2011) | 2 lines
[scaladoc] Cleanup tests. No review.
........
r24599 | extempore | 2011-03-26 17:05:14 +0100 (Sat, 26 Mar 2011) | 2 lines
Fix for cygwin: jline.UnixTerminal is now
scala.tools.jline.UnixTerminal. No review. ........ r24600 | extempore |
2011-03-26 19:22:27 +0100 (Sat, 26 Mar 2011) | 2 lines
Added some explanatory output when jline reader fails to create. No
review. ........ r24601 | extempore | 2011-03-26 20:42:25 +0100 (Sat, 26
Mar 2011) | 1 line
Some accumulated work and polish on classpath and jars. No review.
........ r24602 | extempore | 2011-03-26 20:42:44 +0100 (Sat, 26 Mar
2011) | 1 line
Cleaning up util.Tracer and its usage in Erasure. No review. ........
r24603 | extempore | 2011-03-26 20:43:00 +0100 (Sat, 26 Mar 2011) | 3
lines
Suppressed unnecessary checkcasts on Throwables which were letting
AnyRefs reach the backend. Looks like this was my doing when trying to
wake back up the icode checker. Closes #4393, no review. ........ r24604
| cunei | 2011-03-26 21:47:47 +0100 (Sat, 26 Mar 2011) | 4 lines
Introducing xz compression in nightly builds.
Also removed some obsolete targets related to the old 1.4 version.
........ r24607 | magarcia | 2011-03-27 16:41:46 +0200 (Sun, 27 Mar
2011) | 2 lines
needed when compiling the (jdk2ivkm'd) Scala library with Scala.NET,
and doesn't hurt in forJVM mode. ........ r24608 | extempore |
2011-03-27 17:37:15 +0200 (Sun, 27 Mar 2011) | 1 line
Made :javap less crashy on windows, no review.
........
r24609 | extempore | 2011-03-27 21:46:12 +0200 (Sun, 27 Mar 2011) | 18 lines
Fix for linked lists closes #4080 and proves my desire not to ship
obviously broken code is even greater than my will to hold out for any
help. I threw in a free fix for this which I noticed while in there.
scala> scala.collection.mutable.LinkedList[Int]().head
res0: Int = 0
Also was reminded how useless tests can be:
val ten = DoubleLinkedList(1 to 10: _*)
ten.insert(DoubleLinkedList(11))
// Post-insert position test
require(ten.last == 11)
Fortunately a test confirming buggy behavior still serves a purpose
by breaking when you fix the bug which allowed it to pass, thus letting
you fix the broken test too. Life's (very) little compensations. Linked
list code should still be presumed broken. No review. ........ r24610 |
extempore | 2011-03-28 01:27:05 +0200 (Mon, 28 Mar 2011) | 16 lines
Trying to get fsc doing the right thing with respect to absolute and
relative paths. My knowledge of the problem had heretofore been second
hand, and my understanding of it incomplete. The real problem I have
determined is that there are a bunch of different things which go
wrong if relative paths start being resolved from a different base,
each of which needs custom handling.
classpath-style options, e.g. fsc -cp ../foo.jar path-style options,
e.g. fsc -d ../mydir file arguments, e.g. fsc ../foo.scala
So it was more work than I had realized, or I probably wouldn't have
even touched it. But now it seems to be working as one would want. I
also poured some readability onto the fsc help output.
Closes #4395, no review, but community input would be great. ........
r24611 | extempore | 2011-03-28 05:10:44 +0200 (Mon, 28 Mar 2011) | 2
lines
A paltry 570 cases failing in -Xcheckinit due to some uninitialized
val or other. It is but a trifle! No review. ........ r24612 | extempore
| 2011-03-28 09:34:04 +0200 (Mon, 28 Mar 2011) | 4 lines
Learned an interesting lesson about having an implicit object with a
"def apply(x: Any): List[String]" method imported into power mode. Let's
just say this is not advised. This and other rough edges eliminated from
power mode, no review. ........ r24614 | magarcia | 2011-03-28 15:59:16
+0200 (Mon, 28 Mar 2011) | 1 line
(1) The msil library can now parse modreq and modopt, (2) bug fix in
GenMSIL. review by rytz. Updated msil.jar coming soon. ........ r24615 |
magarcia | 2011-03-28 18:00:13 +0200 (Mon, 28 Mar 2011) | 1 line
msil.jar updated with changeset 24614
........
r24616 | plocinic | 2011-03-28 18:21:52 +0200 (Mon, 28 Mar 2011) | 1 line
Don't analyse symbols with error types. can happen for java symbols
that are forced during the analysis. Partial fix for #1000238 in eclipse
ide, related issue is in #4402. no review ........ r24617 | kzys |
2011-03-28 18:58:54 +0200 (Mon, 28 Mar 2011) | 2 lines
[scaladoc] Remove whitespace around colon and parentheses. Closes
#4372. Review by pedrofurla. ........ r24618 | extempore | 2011-03-28
21:20:58 +0200 (Mon, 28 Mar 2011) | 3 lines
Added some implicitNotFound annotations to commonly used classes,
and some documentation to Manifest. (Said documentation is invisible
for the moment due to #4404.) No review. ........ r24619 | extempore |
2011-03-28 22:07:02 +0200 (Mon, 28 Mar 2011) | 2 lines
Expanding the test which tries to use the collections from java. No
review. ........ r24620 | extempore | 2011-03-28 23:44:33 +0200 (Mon, 28
Mar 2011) | 2 lines
Looks like another java5/java6 difference gets me on a test. At least
this time I was looking for that. No review. ........ r24621 | extempore
| 2011-03-28 23:53:12 +0200 (Mon, 28 Mar 2011) | 3 lines
Removed some bitrotted ant directives which were keeping us from
getting Manifest docs. Thanks to dmharrah. Also removed RichUnit, fare
thee well. Closes #4404, no review. ........ r24622 | extempore |
2011-03-28 23:57:47 +0200 (Mon, 28 Mar 2011) | 4 lines
Eliminated option -Xwarninit, which is warning about a change which
took place 2.5 years ago and is only likely to add to option confusion
at this point. No review. (But let me know if we still need this for
some reason: many more of our options should be culled.) ........ r24623
| extempore | 2011-03-29 00:45:53 +0200 (Tue, 29 Mar 2011) | 3 lines
Made ScalaRunTime.stringOf more general by separating out the part
which formats it for a repl result, and cleaned up some string functions
around the repl. No review. ........ r24624 | extempore | 2011-03-29
04:59:31 +0200 (Tue, 29 Mar 2011) | 26 lines
Polishing the programmatic interface to the repl and other bits
of machinery which we'll have to live with for a while. The repl
classloader now works more like you'd expect a classloader to, as seen
here:
% scala -Dscala.repl.power
scala> class Bippus extends Traversable[Int] { def foreach[U](f: Int => U) = () }
defined class Bippus
scala> intp.classLoader.getResourceAsStream("Bippus").bytes()
res0: Array[Byte] = Array(-54, -2, -70, ...
scala> res0.size
res1: Int = 23954
scala> case class Bippy(x: Int)
defined class Bippy
// classBytes is shorter way to say the same thing scala>
intp.classLoader.classBytes("Bippy").size
res2: Int = 2356
scala> intp.classLoader.classBytes("Bippy$").size
res3: Int = 1741
Closes #4399, no review.
........
r24625 | extempore | 2011-03-29 05:25:38 +0200 (Tue, 29 Mar 2011) | 1 line
And so my attempt to have a performance test draws the final curtain,
no review. ........ r24626 | kzys | 2011-03-29 16:55:30 +0200 (Tue, 29
Mar 2011) | 2 lines
[scaladoc] Add a test of colon and parentheses (#4372). No review.
........ r24627 | kzys | 2011-03-29 17:40:21 +0200 (Tue, 29 Mar 2011) |
2 lines
[scaladoc] Cleanup code. No review.
........
r24628 | kzys | 2011-03-29 18:21:02 +0200 (Tue, 29 Mar 2011) | 2 lines
[scaladoc] Don't create broken link to private companion object.
Closes #4374. Review by pedrofurla. ........ r24629 | extempore |
2011-03-29 20:41:08 +0200 (Tue, 29 Mar 2011) | 5 lines
A bunch of scaladoc cleanups. Tags with the wrong name, tags in the
wrong places, tags saying the wrong thing. I sorted types and values
so deprecated ones are at the end. I think they should be hidden by
default, but this is a big improvement. Leaving #3914 open so they can
be made invisible. No review. ........ r24630 | extempore | 2011-03-29
22:22:22 +0200 (Tue, 29 Mar 2011) | 2 lines
Disabled all the script tests. They're not run from ant and they're
breaking the distribution build. No review. ........ r24631 | extempore
| 2011-03-29 22:22:40 +0200 (Tue, 29 Mar 2011) | 2 lines
Fixing the scalap test rig to work like other test types so it doesn't
break the distribution build. No review. ........ r24632 | extempore |
2011-03-29 22:22:53 +0200 (Tue, 29 Mar 2011) | 2 lines
Transcript pastes now work with leading whitespace (such as my commit
message in r24624), no review. ........ r24633 | extempore | 2011-03-29
22:44:33 +0200 (Tue, 29 Mar 2011) | 2 lines
A change to a test to defend against output change when run with a
plugin enabled. No review. ........ r24634 | cunei | 2011-03-29 23:18:34
+0200 (Tue, 29 Mar 2011) | 2 lines
include files/specialized/*.txt in the set of files packaged in the
test sbp. ........ r24635 | cunei | 2011-03-29 23:39:29 +0200 (Tue, 29
Mar 2011) | 2 lines
Excluding presentation test from sbaz-packaged test suite. ........
r24636 | extempore | 2011-03-30 02:55:20 +0200 (Wed, 30 Mar 2011) | 11
lines
Wanting to deprecate -make, first I had to write a way to deprecate
-make. So there's that, now you can do
val s = SomeSetting(...) withDeprecationMessage "don't use this"
And it will do the usual deprecation things. And, deprecated -make.
And couldn't resist fixing a bug in -make, it would crash if you gave
it its own default option (i.e. -make:all.) Let's deprecate more!
I also did further cleaning up of our help outputs. Do I smell a
pulitzer in the making? No review. ........ r24637 | rytz | 2011-03-30
09:06:08 +0200 (Wed, 30 Mar 2011) | 1 line
fix get-scala-revision script for the case when svn prints some
warnings. no review ........ r24638 | extempore | 2011-03-30 22:40:46
+0200 (Wed, 30 Mar 2011) | 10 lines
Issue warning when doccomments have $variables which go unfulfilled.
Started with patch by dmharrah. Noticed expandVariables never
incremented its recursion guard and ended up rewriting it. To avoid
spurious warnings you can escape $'s, as in this comment:
/** The decoded name of the symbol, e.g. `==` instead of `\$eq\$eq`.
*/
The above will be ignored during expansion and translated to $eq$eq
for output. Closes #4412, no review. ........ r24639 | extempore |
2011-03-30 23:00:08 +0200 (Wed, 30 Mar 2011) | 2 lines
Addressing most of the warnings revealed by the patch to warn about
unknown scaladoc variables. Updated and reran genprod. No review.
........ r24640 | extempore | 2011-03-31 00:47:00 +0200 (Thu, 31 Mar
2011) | 3 lines
Warn about unqualified names in scaladoc links because they don't
work. I think it would be better to just make them work, but the way
things are structured it looks involved. Closes #3696, no review.
........ r24641 | kzys | 2011-03-31 01:38:18 +0200 (Thu, 31 Mar 2011) |
2 lines
[scaladoc] Scaladoc should expand macros recursively. Closes #3484.
Review by dubochet. ........ r24642 | extempore | 2011-03-31 05:59:42
+0200 (Thu, 31 Mar 2011) | 6 lines
Modified some typer logic to allow annotation arguments for constants
which don't have the form Literal(_). The current logic seems to be
avoided most of the time, but scaladoc breaks when it runs into it. This
closes #4301. I can't figure out from the ticket what the deal is with
#2764 and what is presently happening, but it seems like this patch
could only improve the situation. Review by rytz. ........ r24643 |
extempore | 2011-03-31 05:59:57 +0200 (Thu, 31 Mar 2011) | 2 lines
Incidental work on scaladoc while trying to figure out what is up with
usecases. Did a little rewrite of recent patch. No review. ........
r24644 | extempore | 2011-03-31 06:59:35 +0200 (Thu, 31 Mar 2011) | 2
lines
Making the scaladoc command line help look as pretty as all the
others ones do now. No review. ........ r24645 | extempore | 2011-03-31
07:58:01 +0200 (Thu, 31 Mar 2011) | 2 lines
Some minor sensibility improvements to previous patch, and tearing out
some obsolete pieces of scalap. No review. ........ r24646 | extempore |
2011-03-31 08:09:14 +0200 (Thu, 31 Mar 2011) | 2 lines
Fix for interpreter issue with missing newlines wreaking havoc. No
review. ........ r24648 | kzys | 2011-03-31 14:59:56 +0200 (Thu, 31 Mar
2011) | 2 lines
[scaladoc] Don't link to syntetic companion. Closes #4325. Review by
dubochet. ........ r24651 | dragos | 2011-03-31 16:36:38 +0200 (Thu, 31
Mar 2011) | 1 line
One breakage too many, this test is a pest -> disabled. no review.
........ r24652 | dragos | 2011-03-31 16:39:19 +0200 (Thu, 31 Mar 2011)
| 1 line
Fixed failing presentation compiler test. no review. ........ r24653 |
extempore | 2011-03-31 18:41:51 +0200 (Thu, 31 Mar 2011) | 1 line
Emptiness check in swing, closes #1578 no review. ........ r24654 |
extempore | 2011-03-31 18:42:05 +0200 (Thu, 31 Mar 2011) | 4 lines
Added some null checks in swing. I assumed the behavior when the input
verifier is null should be "assume it verifies" not "assume it doesn't"
but since I don't actually know anything about swing this guess could
be wrong. Closes #3783, review by imaier. ........ r24655 | odersky |
2011-03-31 18:46:48 +0200 (Thu, 31 Mar 2011) | 1 line
recommitted 24578: All compiler control methods now do something
sensible when called from presentation compiler thread itself. ........
r24656 | extempore | 2011-03-31 21:26:24 +0200 (Thu, 31 Mar 2011) | 3
lines
Printing refinement types in scaladoc. Actually only printing
one-member refinements, for bigger ones printing the number of members.
Should be improved. Closes #484, no review. ........ r24657 | extempore
| 2011-03-31 21:26:37 +0200 (Thu, 31 Mar 2011) | 3 lines
Fix for a little breakage which crept into power mode. This is
why real things with real types are better than generating code and
remembering to update your strings. No review. ........ r24658 |
extempore | 2011-03-31 22:44:29 +0200 (Thu, 31 Mar 2011) | 7 lines
Separated abstract and concrete value members in scaladoc. This looks
like such a runaway improvement to me that I'm just checking it
in, but if anyone feels differently say the word. I eliminated the
abstract/concrete filter entirely as it is extraneous once you can
just see which is which.
Closes #3831, review by malayeri.
........
r24659 | extempore | 2011-04-01 00:18:43 +0200 (Fri, 01 Apr 2011) | 2 lines
A quick fix for the weird string output one gets in the repl when
calling .par. No review. ........ r24660 | extempore | 2011-04-01
04:18:53 +0200 (Fri, 01 Apr 2011) | 5 lines
Working on the documentation of core classes. Trying to withdraw some
of the goodness I banked a while ago with the AnyVal types. Started on
what will culminate in the total elimination of SourcelessComments.
Cleaned up the docs on ancient classes like Product. More to come. No
review. ........ r24661 | extempore | 2011-04-01 07:02:30 +0200 (Fri, 01
Apr 2011) | 2 lines
A less ad hoc infrastructure for generating AnyVal sources. A few
more comments on said sources. No review. ........ r24662 | extempore |
2011-04-01 08:41:46 +0200 (Fri, 01 Apr 2011) | 1 line
Fix for parsing bug in scaladoc closes #4420, no review. ........
r24663 | extempore | 2011-04-01 18:00:50 +0200 (Fri, 01 Apr 2011) | 3
lines
Since somewhere before 2.8.0 shipped scalac has disgorged a stack
trace for the misdemeanor of specifying a non-existent directory for -d.
No more, no review. ........ r24664 | kzys | 2011-04-01 19:09:59 +0200
(Fri, 01 Apr 2011) | 2 lines
Put "\n" between superclass's comment and subclass's. Closes #4289.
Review by pedrofurla. ........ r24665 | extempore | 2011-04-01 19:18:34
+0200 (Fri, 01 Apr 2011) | 14 lines
Finding myself wanting a working -Ystop, I did the following.
-Ystop-after:phase works
-Ystop-before:phase works
-Ystop:phase is a backward compat alias for -Ystop-after
Until now -Ystop, although documented to "stop after phase", actually
stopped before phase, to the consternation of some. Furthermore the
programmatic way to influence the stop phase (protected def stopPhase in
Global#Run) involved returning true if you wanted to stop before the
phase. So now the command line option works as advertised, and the
method has the same semantics. The only potential loser is some script
which uses -Ystop: based on the actual behavior rather than the documented
behavior. Well, someone had to lose. No review.
........
r24666 | kzys | 2011-04-01 20:57:36 +0200 (Fri, 01 Apr 2011) | 2 lines
On Scaladoc, we should escape meta characters before compile regexp.
No review. ........ r24667 | extempore | 2011-04-02 01:55:01 +0200 (Sat,
02 Apr 2011) | 2 lines
A double completion whammy: crasher for edge condition and method
signatures not being cleaned of their $iws. Closes #4434, no review.
........ r24672 | malayeri | 2011-04-04 15:57:56 +0200 (Mon, 04 Apr
2011) | 1 line
[scaladoc] Add explicit link to show linear supertypes and known
subclasses. Closes #4416. Modifications to style sheets to reduce
number of colors and make the documentation more readable (includes
contributions from Ruediger Keller). No review. ........ r24673 |
malayeri | 2011-04-04 16:34:29 +0200 (Mon, 04 Apr 2011) | 1 line
[scaladoc] Add missing files.
........
r24674 | cunei | 2011-04-04 16:52:55 +0200 (Mon, 04 Apr 2011) | 2 lines
Fix for windows batch files. Closes #4439.
........
r24675 | malayeri | 2011-04-04 17:22:09 +0200 (Mon, 04 Apr 2011) | 1 line
[scaladoc] Minor CSS tweaks. No review.
........
r24676 | kzys | 2011-04-04 18:19:32 +0200 (Mon, 04 Apr 2011) | 2 lines
Every tag element (even @define and @usecase) end before the next
recognised tag. Closes #4409. Review by extempore. ........ r24677 |
odersky | 2011-04-04 18:34:02 +0200 (Mon, 04 Apr 2011) | 1 line
Fixed crashes in IDE on default parameters in constructors. ........
r24678 | malayeri | 2011-04-04 18:36:27 +0200 (Mon, 04 Apr 2011) | 1
line
[scaladoc] Change div id's of abstract and concrete members so that
"order by inheritance" action works properly. Fixes issue introduced in
r24658. Review by extempore. ........ r24679 | malayeri | 2011-04-04
18:37:51 +0200 (Mon, 04 Apr 2011) | 1 line
[scaladoc] Make object/template name be a link to the companion.
Closes #4411. Review by extempore to make sure the design makes sense.
........ r24680 | malayeri | 2011-04-04 18:38:11 +0200 (Mon, 04 Apr
2011) | 1 line
[scaladoc] Fix minor CSS issue. No review.
........
r24681 | odersky | 2011-04-04 19:35:19 +0200 (Mon, 04 Apr 2011) | 1 line
Some localized code cleanup.
........
r24682 | malayeri | 2011-04-04 20:17:26 +0200 (Mon, 04 Apr 2011) | 1 line
[scaladoc] Updated trait, package, class, and object icons. No review.
........ r24683 | extempore | 2011-04-05 03:48:11 +0200 (Tue, 05 Apr
2011) | 12 lines
Added a long overdue warning for when people define a class and then
an object or vice versa in the repl.
scala> object Bippy { implicit val myImplicitsDontWork = 5 }
defined module Bippy
scala> trait Bippy { val x = "hello" }
defined trait Bippy
warning: previously defined object Bippy is not a companion to trait Bippy.
Companions must be defined together; you may wish to use :paste mode for this.
No review.
........
r24684 | extempore | 2011-04-05 03:48:31 +0200 (Tue, 05 Apr 2011) | 6 lines
Enhancing the repl-testing code by turning it into a transcript
producing machine. "Here's some code." "Here's a transcript!" "Good
day to you, sir!" "No, good day to YOU!"
These changes are awesome. Look at the checkfile diffs for god's sake,
they'll make you weep with joy. No review. ........ r24685 | rytz |
2011-04-05 09:50:41 +0200 (Tue, 05 Apr 2011) | 1 line
make natives test run on win64. no review
........
r24686 | rytz | 2011-04-05 09:54:41 +0200 (Tue, 05 Apr 2011) | 1 line
svn property: mark the dll as binary. no review.
........
r24687 | malayeri | 2011-04-05 10:36:32 +0200 (Tue, 05 Apr 2011) | 1 line
[scaladoc] Fix failing test. No review.
........
r24688 | odersky | 2011-04-05 14:19:10 +0200 (Tue, 05 Apr 2011) | 1 line
Fixes #4298, by correcting doc comment
........
r24689 | dragos | 2011-04-05 18:19:45 +0200 (Tue, 05 Apr 2011) | 3 lines
Wrapped exceptions coming from calls to 'ask' in a FailedException.
This allows to get a stack trace from both the presentation compiler
thread and the calling thread. review by odersky. ........ r24690 |
odersky | 2011-04-05 18:22:21 +0200 (Tue, 05 Apr 2011) | 1 line
better handling of on-same-thread calls.
........
r24691 | dragos | 2011-04-05 19:03:51 +0200 (Tue, 05 Apr 2011) | 1 line
Forgot a import in the last commit. no review.
........
r24692 | extempore | 2011-04-06 01:19:26 +0200 (Wed, 06 Apr 2011) | 3 lines
Some accumulated cleanups around the interpreter loop commands as I
attempt to make my way all the way to the promised land of documenting
it. No review. ........ r24693 | extempore | 2011-04-06 06:33:15 +0200
(Wed, 06 Apr 2011) | 1 line
Fixed an edge case setting crasher, no review.
........
r24694 | extempore | 2011-04-06 06:33:27 +0200 (Wed, 06 Apr 2011) | 3 lines
Fixed a failure output regression I introduced working around a
process bug. Unrolled the code I'd put in to work around the now-fixed
process bug. No review. ........ r24695 | extempore | 2011-04-06
06:33:46 +0200 (Wed, 06 Apr 2011) | 1 line
Misc cleanups and crash avoidance, no review.
........
r24696 | malayeri | 2011-04-06 16:23:25 +0200 (Wed, 06 Apr 2011) | 1 line
Set "synthetic" flag for methods $asInstanceOf and $isInstanceOf.
Closes #4368. No review. ........ r24697 | malayeri | 2011-04-06
16:24:30 +0200 (Wed, 06 Apr 2011) | 1 line
[scaladoc] Reduce horizontal lines in html output, refactor
Template.css to improve readability. No review. ........ r24698 |
malayeri | 2011-04-06 16:28:41 +0200 (Wed, 06 Apr 2011) | 1 line
Update documentation of MutableList. Closes #4397. No review. ........
r24699 | odersky | 2011-04-06 16:32:32 +0200 (Wed, 06 Apr 2011) | 1 line
More refinements to avoid deadlocks systematically when asking from
presentation compiler thread ........ r24700 | extempore | 2011-04-06
20:48:15 +0200 (Wed, 06 Apr 2011) | 3 lines
The beautification of repl pasting had the problem that the new
beautiful output was not itself pastable. Now I have achieved "paste
idempotence". No review. ........ r24701 | extempore | 2011-04-07
09:30:38 +0200 (Thu, 07 Apr 2011) | 2 lines
Clamping down on some more breakage which snuck into power mode. I
really need some power tests. No review. ........ r24702 | extempore |
2011-04-07 09:31:02 +0200 (Thu, 07 Apr 2011) | 9 lines
Deleted SourcelessComments. Created source files for Any, AnyRef,
Nothing and Null with improved documentation of their particulars
and convinced scaladoc to parse them without leaving scalac
institutionalized. Now rather than seeing our hardcoded documentation
strings bitrot in a shadowy flight from classes which do not exist, we
are championing the cause of the innocent and powerless. Nothing and
Null aren't above the law!
So now any responsible party can fire up their text editor and go
to town on Nothing.scala. As I'm sure they will. Review by malayeri.
........ r24703 | extempore | 2011-04-07 09:31:14 +0200 (Thu, 07 Apr
2011) | 2 lines
Added a comment to Dynamic sharing that if you don't supply mr.
-Xexperimental, it won't work. No review. ........ r24704 | malayeri |
2011-04-07 15:34:14 +0200 (Thu, 07 Apr 2011) | 1 line
[scaladoc] Make links to classes and traits not be the entire line,
but just the template name. Closes #4444. No review. ........ r24705 |
malayeri | 2011-04-07 16:03:49 +0200 (Thu, 07 Apr 2011) | 1 line
[scaladoc] Don't generate an attributes block if its contents are
empty. No review. ........ r24706 | odersky | 2011-04-07 16:30:56 +0200
(Thu, 07 Apr 2011) | 1 line
Fixes #2808 without redefining what override means. Review by
extempore. ........ r24708 | extempore | 2011-04-07 19:43:41 +0200 (Thu,
07 Apr 2011) | 10 lines
Made power mode more configurable. Don't think of this as the
long-term configuration answer, but what I have any chance of doing
before 2.9 ships.
// file to interpret when entering power mode instead of default
-Dscala.repl.power.initcode=/path/to/file // file holding banner to
display instead of default -Dscala.repl.power.banner=/path/to/file
No review.
........
r24709 | magarcia | 2011-04-08 13:38:48 +0200 (Fri, 08 Apr 2011) | 1 line
[MSIL] handling of volatile fields. review by rytz. ........ r24710 |
malayeri | 2011-04-08 16:26:22 +0200 (Fri, 08 Apr 2011) | 1 line
[scaladoc] Separate sections for "linear supertype" and "known
subclasses" using patch provided by Ruediger Keller. Closes #4456.
Closes #4304. ........ r24711 | malayeri | 2011-04-08 17:10:32 +0200
(Fri, 08 Apr 2011) | 1 line
[scaladoc] Don't generate long comments if they are the same as the
short comment. Closes #4455. No review. ........ r24712 | odersky |
2011-04-08 18:31:26 +0200 (Fri, 08 Apr 2011) | 1 line
Closes #4431. Review by extempore.
........
r24713 | extempore | 2011-04-08 18:42:18 +0200 (Fri, 08 Apr 2011) | 2 lines
Factoring the imports related code out of the main Interpreter class,
no review. ........ r24714 | extempore | 2011-04-08 18:42:38 +0200 (Fri,
08 Apr 2011) | 1 line
Added :imports command, no review.
........
r24715 | extempore | 2011-04-10 04:17:28 +0200 (Sun, 10 Apr 2011) | 1 line
Made the reading of y/n a little more robust. No review. ........
r24716 | extempore | 2011-04-10 04:18:08 +0200 (Sun, 10 Apr 2011) | 2
lines
More fun with xml and elements not appearing equal. Closes #4387, no
review. ........ r24717 | extempore | 2011-04-10 04:18:32 +0200 (Sun, 10
Apr 2011) | 2 lines
Changed scala.io.Position into something other than a fixed object
which throws exceptions when the position overflows. Closes #4382, no
review. ........ r24719 | extempore | 2011-04-11 05:04:47 +0200 (Mon, 11
Apr 2011) | 2 lines
Improving the repl help infrastructure, and made the :wrap command
more robust. No review. ........ r24720 | extempore | 2011-04-11
07:01:17 +0200 (Mon, 11 Apr 2011) | 4 lines
Found there was still all kinds of detritus remaining from the
deceased IMPLICITMETHODtpe and ImplicitMethodType. Applied wrecking
ball, review by moors. (Can I do the same thing with DEBRUIJNINDEXtpe
and DeBruijnIndex?) ........ r24721 | eugenevigdorchik | 2011-04-11
08:42:47 +0200 (Mon, 11 Apr 2011) | 1 line
Tighten the visibility of interactive.Global. No review. ........
r24722 | odersky | 2011-04-11 09:01:55 +0200 (Mon, 11 Apr 2011) | 1 line
Closes #4396. No review.
........
r24723 | odersky | 2011-04-11 10:53:51 +0200 (Mon, 11 Apr 2011) | 1 line
Closes #4380. No review.
........
r24724 | odersky | 2011-04-11 10:56:57 +0200 (Mon, 11 Apr 2011) | 1 line
Deleted debug output that made it into previous commit. ........
Diffstat (limited to 'src')
226 files changed, 5983 insertions, 4213 deletions
diff --git a/src/build/genprod.scala b/src/build/genprod.scala index d1c610d046..d587d0464d 100644 --- a/src/build/genprod.scala +++ b/src/build/genprod.scala @@ -15,7 +15,7 @@ * @author Burak Emir, Stephane Micheloud, Geoffrey Washburn, Paul Phillips * @version 1.1 */ -object genprod extends Application { +object genprod extends App { val MAX_ARITY = 22 def arities = (1 to MAX_ARITY).toList @@ -38,6 +38,7 @@ object genprod extends Application { def to = (1 to i).toList def s = if (i == 1) "" else "s" def className = name + i + def classAnnotation = "" def fileName = className + ".scala" def targs = to map ("T" + _) def vdefs = to map ("v" + _) @@ -72,7 +73,6 @@ package %s """.trim.format(genprodString, packageDef, imports) } - def args = arguments if (args.length != 1) { println("please give path of output directory") exit(-1) @@ -110,8 +110,9 @@ object FunctionZero extends Function(0) { } object FunctionOne extends Function(1) { + override def classAnnotation = "@annotation.implicitNotFound(msg = \"No implicit view available from ${T1} => ${R}.\")\n" override def contravariantSpecs = "@specialized(scala.Int, scala.Long, scala.Float, scala.Double) " - override def covariantSpecs = "@specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) " + override def covariantSpecs = "@specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) " override def descriptiveComment = functionNTemplate.format("succ", "anonfun1", """ @@ -183,7 +184,7 @@ class Function(val i: Int) extends Group("Function") with Arity { /** A function of {i} parameter{s}. * {descriptiveComment} */ -trait {className}{contraCoArgs} extends AnyRef {{ self => +{classAnnotation}trait {className}{contraCoArgs} extends AnyRef {{ self => /** Apply the body of this function to the argument{s}. * @return the result of function application. */ @@ -298,7 +299,7 @@ object TupleTwo extends Tuple(2) * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] = new Zipped[Repr1, El1, Repr2, El2](_1, _2) @@ -406,7 +407,7 @@ object TupleThree extends Tuple(3) { * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2], diff --git a/src/build/pack.xml b/src/build/pack.xml index fa8dc4d935..123fd0b8fe 100644 --- a/src/build/pack.xml +++ b/src/build/pack.xml @@ -21,12 +21,21 @@ MAIN DISTRIBUTION PACKAGING </target> <target name="pack-archives.tar" depends="pack-archives.start"> - <tar destfile="${dists.dir}/archives/scala-${version.number}.tgz" - compression="gzip" longfile="gnu"> + <tar destfile="${dists.dir}/archives/scala-${version.number}" + compression="none" longfile="gnu"> <tarfileset dir="${dist.dir}" prefix="scala-${version.number}" includes="bin/**" mode="755"/> <tarfileset dir="${dist.dir}" prefix="scala-${version.number}" excludes="bin/**"/> </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}.tgz" fileext=".md5"/> + <gzip src="${dists.dir}/archives/scala-${version.number}" destfile="${dists.dir}/archives/scala-${version.number}.tgz"/> + <exec executable="xz" failifexecutionfails="false"> + <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}"/> + </exec> + <delete file="${dists.dir}/archives/scala-${version.number}" /> + <checksum fileext=".md5"> + <fileset dir="${dists.dir}/archives"> + <include name="scala-${version.number}.t?z"/> + </fileset> + </checksum> </target> <target name="pack-archives.zip" depends="pack-archives.tar"> @@ -37,16 +46,25 @@ MAIN DISTRIBUTION PACKAGING </target> <target name="pack-devel-docs.tar" depends="pack-archives.zip"> - <tar destfile="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz" - compression="gzip" longfile="gnu"> + <tar destfile="${dists.dir}/archives/scala-${version.number}-devel-docs" + compression="none" longfile="gnu"> <tarfileset dir="${dist.dir}/doc/scala-devel-docs" prefix="scala-${version.number}-devel-docs"/> </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz" fileext=".md5"/> + <gzip src="${dists.dir}/archives/scala-${version.number}-devel-docs" destfile="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz"/> + <exec executable="xz" failifexecutionfails="false"> + <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}-devel-docs"/> + </exec> + <delete file="${dists.dir}/archives/scala-${version.number}-devel-docs" /> + <checksum fileext=".md5"> + <fileset dir="${dists.dir}/archives"> + <include name="scala-${version.number}-devel-docs.t?z"/> + </fileset> + </checksum> </target> <target name="pack-archives.src" depends="pack-devel-docs.tar"> - <tar destfile="${dists.dir}/archives/scala-${version.number}-sources.tgz" - compression="gzip" longfile="gnu"> + <tar destfile="${dists.dir}/archives/scala-${version.number}-sources" + compression="none" longfile="gnu"> <tarfileset dir="${basedir}" prefix="scala-${version.number}-sources"> <exclude name="bin/**"/> <exclude name="build/**"/> @@ -60,7 +78,16 @@ MAIN DISTRIBUTION PACKAGING <include name="test/partest"/> </tarfileset> </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}-sources.tgz" fileext=".md5"/> + <gzip src="${dists.dir}/archives/scala-${version.number}-sources" destfile="${dists.dir}/archives/scala-${version.number}-sources.tgz"/> + <exec executable="xz" failifexecutionfails="false"> + <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}-sources"/> + </exec> + <delete file="${dists.dir}/archives/scala-${version.number}-sources" /> + <checksum fileext=".md5"> + <fileset dir="${dists.dir}/archives"> + <include name="scala-${version.number}-sources.t?z"/> + </fileset> + </checksum> </target> <target name="pack-archives.done" depends="pack-archives.src"/> @@ -120,7 +147,8 @@ MAIN DISTRIBUTION SBAZ <binset dir="${basedir}/test" includes="clitest,diff/diff.*,diff/lib*.dll,partest,partest.bat"/> <miscset dir="${basedir}/test" - includes="files/**/*.args,files/**/*.check,files/**/*.dll,files/**/*.jar,files/**/*.java,files/**/*.scala,files/**/*.flags,files/cli/**/*.check.*,files/jvm/*.so,files/shootout/*.javaopts,files/shootout/*.runner,files/shootout/*.txt,files/**/*.test"/> + includes="files/**/*.args,files/**/*.check,files/**/*.dll,files/**/*.jar,files/**/*.java,files/**/*.scala,files/**/*.flags,files/cli/**/*.check.*,files/jvm/*.so,files/shootout/*.javaopts,files/shootout/*.runner,files/shootout/*.txt,files/specialized/*.txt,files/**/*.test" + excludes="files/presentation"/> <!-- <srcset dir="${dist.dir}/src" includes="scala-partest-src.jar"/> --> <libset dir="${dist.dir}/lib" includes="scala-partest.jar"/> <libset dir="${lib.dir}" includes="scalacheck.jar"/> @@ -262,41 +290,11 @@ MAIN DISTRIBUTION SBAZ <target name="pack-maven.done" depends="pack-maven.scripts"/> <!-- =========================================================================== -JAVA FOUR DISTRIBUTION PACKAGING -============================================================================ --> - - <target name="fourpack-archives.start"> - <mkdir dir="${dists.dir}/archives"/> - </target> - - <target name="fourpack-archives.tar" depends="fourpack-archives.start"> - <tar destfile="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" - compression="gzip" longfile="gnu"> - <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4" - includes="bin/**" mode="755"/> - <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4" - excludes="bin/**"/> - </tar> - <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" fileext=".md5"/> - </target> - - <target name="fourpack-archives.zip" depends="fourpack-archives.tar"> - <zip destfile="${dists.dir}/archives/scala-${version.number}-jvm4.zip"> - <zipfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"/> - </zip> - <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.zip" fileext=".md5"/> - </target> - - <target name="fourpack-archives.done" depends="fourpack-archives.zip"/> - -<!-- =========================================================================== MISCELLANEOUS ============================================================================ --> <target name="pack-all.done" depends="pack-archives.done, pack-sbaz.done, pack-maven.done"/> - <target name="fourpack-all.done" depends="fourpack-archives.done"/> - <!-- =========================================================================== MISCELLANEOUS ============================================================================ --> diff --git a/src/compiler/scala/tools/ant/Scaladoc.scala b/src/compiler/scala/tools/ant/Scaladoc.scala index 727b8db0cc..419f60af21 100644 --- a/src/compiler/scala/tools/ant/Scaladoc.scala +++ b/src/compiler/scala/tools/ant/Scaladoc.scala @@ -112,6 +112,9 @@ class Scaladoc extends ScalaMatchingTask { /** Instruct the compiler to generate links to sources */ private var docsourceurl: Option[String] = None + /** Point scaladoc at uncompilable sources. */ + private var docUncompilable: Option[String] = None + /** Instruct the compiler to use additional parameters */ private var addParams: String = "" @@ -331,6 +334,10 @@ class Scaladoc extends ScalaMatchingTask { buildError("Unknown unchecked flag '" + input + "'") } + def setDocUncompilable(input: String) { + docUncompilable = Some(input) + } + /*============================================================================*\ ** Properties getters ** \*============================================================================*/ @@ -518,6 +525,8 @@ class Scaladoc extends ScalaMatchingTask { if (!doctitle.isEmpty) docSettings.doctitle.value = decodeEscapes(doctitle.get) if (!docversion.isEmpty) docSettings.docversion.value = decodeEscapes(docversion.get) if (!docsourceurl.isEmpty) docSettings.docsourceurl.value =decodeEscapes(docsourceurl.get) + if (!docUncompilable.isEmpty) docSettings.docUncompilable.value = decodeEscapes(docUncompilable.get) + docSettings.deprecation.value = deprecation docSettings.unchecked.value = unchecked if (!docgenerator.isEmpty) docSettings.docgenerator.value = docgenerator.get diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl index 3280796878..1976535333 100644 --- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl @@ -86,7 +86,7 @@ if $cygwin; then case "$TERM" in rxvt* | xterm*) stty -icanon min 1 -echo - CYGWIN_JLINE_TERMINAL="-Djline.terminal=jline.UnixTerminal" + CYGWIN_JLINE_TERMINAL="-Djline.terminal=scala.tools.jline.UnixTerminal" ;; esac fi diff --git a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl index a5fd17a7a9..21651831df 100644 --- a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl @@ -15,14 +15,6 @@ if "%OS%" NEQ "Windows_NT" ( @@setlocal
call :set_home
-set _ARGS=
-:loop
- rem Argument %1 may contain quotes so we use parentheses here
- if (%1)==() goto :looped
- set _ARGS=%_ARGS% %1
- shift
-goto loop
-:looped
rem We use the value of the JAVACMD environment variable if defined
set _JAVACMD=%JAVACMD%
@@ -47,8 +39,8 @@ if "%_TOOL_CLASSPATH%"=="" ( set _PROPS=-Dscala.home="%_SCALA_HOME%" -Denv.emacs="%EMACS%" @properties@
-rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
-"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
+rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
+"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
goto end
rem ##########################################################################
diff --git a/src/compiler/scala/tools/cmd/gen/AnyVals.scala b/src/compiler/scala/tools/cmd/gen/AnyVals.scala index f6f48359cd..a1280eec8e 100644 --- a/src/compiler/scala/tools/cmd/gen/AnyVals.scala +++ b/src/compiler/scala/tools/cmd/gen/AnyVals.scala @@ -6,9 +6,139 @@ package scala.tools.cmd package gen +/** Code generation of the AnyVal types and their companions. + */ +trait AnyValReps { + self: AnyVals => + + sealed abstract class AnyValNum(name: String) extends AnyValRep(name) { + def isCardinal: Boolean = isIntegerType(this) + def unaryOps = if (isCardinal) List("+", "-", "~") else List("+", "-") + def bitwiseOps = if (isCardinal) List("|", "&", "^") else Nil + def shiftOps = if (isCardinal) List("<<", ">>>", ">>") else Nil + def comparisonOps = List("==", "!=", "<", "<=", ">", ">=") + def otherOps = List("+", "-" ,"*", "/", "%") + + // Given two numeric value types S and T , the operation type of S and T is defined as follows: + // If both S and T are subrange types then the operation type of S and T is Int. + // Otherwise the operation type of S and T is the larger of the two types wrt ranking. + // Given two numeric values v and w the operation type of v and w is the operation type + // of their run-time types. + def opType(that: AnyValNum): AnyValNum = { + val rank = IndexedSeq(I, L, F, D) + (rank indexOf this, rank indexOf that) match { + case (-1, -1) => I + case (r1, r2) => rank apply (r1 max r2) + } + } + + def mkCoercions = numeric map (x => "def to%s: %s".format(x, x)) + def mkUnaryOps = unaryOps map (x => "def unary_%s : %s".format(x, this opType I)) + def mkStringOps = List("def +(x: String): String") + def mkShiftOps = ( + for (op <- shiftOps ; arg <- List(I, L)) yield + "def %s(x: %s): %s".format(op, arg, this opType I) + ) + + def clumps: List[List[String]] = { + val xs1 = List(mkCoercions, mkUnaryOps, mkStringOps, mkShiftOps) map (xs => if (xs.isEmpty) xs else xs :+ "") + val xs2 = List( + mkBinOpsGroup(comparisonOps, numeric, _ => Z), + mkBinOpsGroup(bitwiseOps, cardinal, this opType _), + mkBinOpsGroup(otherOps, numeric, this opType _) + ) + xs1 ++ xs2 + } + def classLines = clumps.foldLeft(List[String]()) { + case (res, Nil) => res + case (res, lines) => + val xs = lines map { + case "" => "" + case s => interpolate(s) + " = " + stub + } + res ++ xs + } + def objectLines = { + val comp = if (isCardinal) cardinalCompanion else floatingCompanion + (comp + allCompanions).trim.lines map interpolate toList + } + + /** Makes a set of binary operations based on the given set of ops, args, and resultFn. + * + * @param ops list of function names e.g. List(">>", "%") + * @param args list of types which should appear as arguments + * @param resultFn function which calculates return type based on arg type + * @return list of function definitions + */ + def mkBinOpsGroup(ops: List[String], args: List[AnyValNum], resultFn: AnyValNum => AnyValRep): List[String] = ( + ops flatMap (op => + args.map(arg => "def %s(x: %s): %s".format(op, arg, resultFn(arg))) :+ "" + ) + ).toList + } + + sealed abstract class AnyValRep(val name: String) { + def classLines: List[String] + def objectLines: List[String] + + def lcname = name.toLowerCase + def boxedName = this match { + case U => "scala.runtime.BoxedUnit" + case C => "java.lang.Character" + case I => "java.lang.Integer" + case _ => "java.lang." + name + } + def zeroRep = this match { + case L => "0L" + case F => "0.0f" + case D => "0.0d" + case _ => "0" + } + + def indent(s: String) = if (s == "") "" else " " + s + def indentN(s: String) = s.lines map indent mkString "\n" + + def boxUnboxImpls = Map( + "@boxImpl@" -> "%s.valueOf(x)".format(boxedName), + "@unboxImpl@" -> "x.asInstanceOf[%s].%sValue()".format(boxedName, lcname), + "@unboxDoc@" -> "the %s resulting from calling %sValue() on `x`".format(name, lcname) + ) + def interpolations = Map( + "@name@" -> name, + "@boxed@" -> boxedName, + "@lcname@" -> lcname, + "@zero@" -> zeroRep + ) ++ boxUnboxImpls + + def interpolate(s: String): String = interpolations.foldLeft(s) { + case (str, (key, value)) => str.replaceAll(key, value) + } + def classDoc = interpolate(classDocTemplate) + def objectDoc = "" + def mkImports = "" + def mkClass = assemble("final class", "AnyVal", classLines) + "\n" + def mkObject = assemble("object", "AnyValCompanion", objectLines) + "\n" + def make() = List[String]( + headerTemplate, + mkImports, + classDoc, + mkClass, + objectDoc, + mkObject + ) mkString "" + + def assemble(what: String, parent: String, lines: List[String]): String = { + val decl = "%s %s extends %s ".format(what, name, parent) + val body = if (lines.isEmpty) "{ }\n\n" else lines map indent mkString ("{\n", "\n", "\n}\n") + + decl + body + } + override def toString = name + } +} + trait AnyValTemplates { - def timestampString = "" - def template = (""" + def headerTemplate = (""" /* __ *\ ** ________ ___ / / ___ Scala API ** ** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL ** @@ -20,60 +150,61 @@ trait AnyValTemplates { %s package scala -import java.{ lang => jl } - """.trim.format(timestampString) + "\n\n" - ) - - def booleanBody = """ -final class Boolean extends AnyVal { - def unary_! : Boolean = sys.error("stub") - - def ==(x: Boolean): Boolean = sys.error("stub") - def !=(x: Boolean): Boolean = sys.error("stub") - def ||(x: Boolean): Boolean = sys.error("stub") - def &&(x: Boolean): Boolean = sys.error("stub") - // Compiler won't build with these seemingly more accurate signatures - // def ||(x: => Boolean): Boolean = sys.error("stub") - // def &&(x: => Boolean): Boolean = sys.error("stub") - def |(x: Boolean): Boolean = sys.error("stub") - def &(x: Boolean): Boolean = sys.error("stub") - def ^(x: Boolean): Boolean = sys.error("stub") -} +""".trim.format(timestampString) + "\n\n") -object Boolean extends AnyValCompanion { - override def toString = "object scala.Boolean" - def box(x: Boolean): jl.Boolean = jl.Boolean.valueOf(x) - def unbox(x: jl.Object): Boolean = x.asInstanceOf[jl.Boolean].booleanValue() -} - """.trim + def classDocTemplate = (""" +/** `@name@` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.@name@]] => [[scala.runtime.Rich@name@]] + * which provides useful non-primitive operations. + */ +""".trim + "\n") - def unitBody = """ -import runtime.BoxedUnit + def timestampString = "// DO NOT EDIT, CHANGES WILL BE LOST.\n" + def stub = """sys.error("stub")""" -final class Unit extends AnyVal { } + def allCompanions = """ +/** Transform a value type into a boxed reference type. + * + * @param x the @name@ to be boxed + * @return a @boxed@ offering `x` as its underlying value. + */ +def box(x: @name@): @boxed@ = @boxImpl@ + +/** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a @boxed@. + * + * @param x the @boxed@ to be unboxed. + * @throws ClassCastException if the argument is not a @boxed@ + * @return @unboxDoc@ + */ +def unbox(x: java.lang.Object): @name@ = @unboxImpl@ -object Unit extends AnyValCompanion { - override def toString = "object scala.Unit" - def box(x: Unit): BoxedUnit = BoxedUnit.UNIT - def unbox(x: jl.Object): Unit = () -} - """.trim +/** The String representation of the scala.@name@ companion object. + */ +override def toString = "object scala.@name@" +""" def cardinalCompanion = """ -final val MinValue = @type@.MIN_VALUE -final val MaxValue = @type@.MAX_VALUE +/** The smallest value representable as a @name@. + */ +final val MinValue = @boxed@.MIN_VALUE -def box(x: @name@): @type@ = @type@.valueOf(x) -def unbox(x: jl.Object): @name@ = x.asInstanceOf[@type@].@lcname@Value() -override def toString = "object scala.@name@" - """.trim.lines +/** The largest value representable as a @name@. + */ +final val MaxValue = @boxed@.MAX_VALUE +""" def floatingCompanion = """ -/** The smallest positive value greater than @zero@.*/ -final val MinPositiveValue = @type@.MIN_VALUE -final val NaN = @type@.NaN -final val PositiveInfinity = @type@.POSITIVE_INFINITY -final val NegativeInfinity = @type@.NEGATIVE_INFINITY +/** The smallest positive value greater than @zero@ which is + * representable as a @name@. + */ +final val MinPositiveValue = @boxed@.MIN_VALUE +final val NaN = @boxed@.NaN +final val PositiveInfinity = @boxed@.POSITIVE_INFINITY +final val NegativeInfinity = @boxed@.NEGATIVE_INFINITY @deprecated("use @name@.MinPositiveValue instead") final val Epsilon = MinPositiveValue @@ -83,138 +214,67 @@ final val Epsilon = MinPositiveValue * is the smallest positive value representable by a @name@. In Scala that number * is called @name@.MinPositiveValue. */ -final val MinValue = -@type@.MAX_VALUE +final val MinValue = -@boxed@.MAX_VALUE /** The largest finite positive number representable as a @name@. */ -final val MaxValue = @type@.MAX_VALUE - -def box(x: @name@): @type@ = @type@.valueOf(x) -def unbox(x: jl.Object): @name@ = x.asInstanceOf[@type@].@lcname@Value() -override def toString = "object scala.@name@" - """.trim.lines +final val MaxValue = @boxed@.MAX_VALUE +""" } -class AnyVals extends AnyValTemplates { - val B = "Byte" - val S = "Short" - val C = "Char" - val I = "Int" - val L = "Long" - val F = "Float" - val D = "Double" - - lazy val cardinal = List(B, S, C, I, L) - lazy val floating = List(F, D) - lazy val numeric = cardinal ++ floating - - def javaType(primType: String) = "jl." + (primType match { - case C => "Character" - case I => "Integer" - case t => t - }) - - def make() = - (numeric zip (numeric map (name => new AnyValOps(name).make()))) ++ List( - ("Boolean", template + booleanBody), - ("Unit", template + unitBody) - ) - - class AnyValOps(name: String) { - val isCardinal = cardinal contains name - val restype = if ("LFD" contains name.head) name else I - val tpe = javaType(name) - val zero = name.head match { - case 'L' => "0L" - case 'F' => "0.0f" - case 'D' => "0.0d" - case _ => "0" - } - val interpolations = Map( - "@restype@" -> restype, - "@name@" -> name, - "@type@" -> tpe, - "@lcname@" -> name.toLowerCase, - "@zero@" -> zero - ) - - def mkCoercions = numeric map (x => "def to%s: %s".format(x, x)) - def mkUnaryOps = unaryops map (op => "def unary_%s : @restype@".format(op)) - def mkCommon = List( - "def +(x: String): String" - ) - def mkShiftOps = ( - for (op <- shiftops ; tpe <- List(I, L)) yield - "def %s(x: %s): @restype@".format(op, tpe) - ) - - def clumps: List[List[String]] = { - val xs1 = List(mkCoercions, mkUnaryOps, mkCommon, mkShiftOps) map (xs => if (xs.isEmpty) xs else xs :+ "") - val xs2 = List( - mkBinOpsGroup(boolBinops, numeric, _ => "Boolean"), - mkBinOpsGroup(bitwiseops, cardinal, resultTypeForArg), - mkBinOpsGroup(otherBinops, numeric, resultTypeForArg) - ) - xs1 ++ xs2 - } - - def defImplementation = "sys.error(\"stub\")" - def indent(s: String) = if (s == "") "" else " " + s - def mkClass = { - val lines = clumps.foldLeft(List[String]()) { - case (res, Nil) => res - case (res, lines) => - val xs = lines map { - case "" => "" - case s => interpolate(s) + " = " + defImplementation - } - res ++ xs - } - assemble("final class", "AnyVal", lines) - } - def mkObject = assemble("object", "AnyValCompanion", companionBody map interpolate toList) - - def assemble(what: String, parent: String, lines: List[String]): String = ( - List(what, name, "extends", parent, "{").mkString(" ") +: - (lines map indent) :+ - "}" - ).mkString("\n", "\n", "\n") - - def make() = template + mkClass + "\n" + mkObject - - def interpolate(s: String): String = interpolations.foldLeft(s) { - case (str, (key, value)) => str.replaceAll(key, value) - } - - /** Makes a set of binary operations based on the given set of ops, args, and resultFn. - * - * @param ops list of function names e.g. List(">>", "%") - * @param args list of types which should appear as arguments - * @param resultFn function which calculates return type based on arg type - * @return list of function definitions - */ - def mkBinOpsGroup(ops: List[String], args: List[String], resultFn: String => String): List[String] = ( - ops flatMap { op => - args.map(arg => "def %s(x: %s): ".format(op, arg) + resultFn(arg)) :+ "" - } +class AnyVals extends AnyValReps with AnyValTemplates { + object B extends AnyValNum("Byte") + object S extends AnyValNum("Short") + object C extends AnyValNum("Char") + object I extends AnyValNum("Int") + object L extends AnyValNum("Long") + object F extends AnyValNum("Float") + object D extends AnyValNum("Double") + object Z extends AnyValRep("Boolean") { + def classLines = """ +def unary_! : Boolean = sys.error("stub") + +def ==(x: Boolean): Boolean = sys.error("stub") +def !=(x: Boolean): Boolean = sys.error("stub") +def ||(x: Boolean): Boolean = sys.error("stub") +def &&(x: Boolean): Boolean = sys.error("stub") +// Compiler won't build with these seemingly more accurate signatures +// def ||(x: => Boolean): Boolean = sys.error("stub") +// def &&(x: => Boolean): Boolean = sys.error("stub") +def |(x: Boolean): Boolean = sys.error("stub") +def &(x: Boolean): Boolean = sys.error("stub") +def ^(x: Boolean): Boolean = sys.error("stub") + """.trim.lines.toList + + def objectLines = interpolate(allCompanions).lines.toList + } + object U extends AnyValRep("Unit") { + override def classDoc = """ +/** Unit is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. There is + * only one value of type Unit: `()`. + */ +""" + def classLines = Nil + def objectLines = interpolate(allCompanions).lines.toList + + override def boxUnboxImpls = Map( + "@boxImpl@" -> "scala.runtime.BoxedUnit.UNIT", + "@unboxImpl@" -> "()", + "@unboxDoc@" -> "the Unit value ()" ) + } - def resultTypeForArg(arg: String): String = arg match { - case L if isCardinal => L - case F => if (name == D) D else F - case D => D - case _ => restype - } + def isSubrangeType = Set(B, S, C) + def isIntegerType = Set(B, S, C, I, L) + def isFloatingType = Set(F, D) + def isWideType = Set(L, D) - def unaryops = if (isCardinal) List("+", "-", "~") else List("+", "-") - def bitwiseops = if (isCardinal) List("|", "&", "^") else Nil - def shiftops = if (isCardinal) List("<<", ">>>", ">>") else Nil - def boolBinops = List("==", "!=", "<", "<=", ">", ">=") - def otherBinops = List("+", "-" ,"*", "/", "%") + def cardinal = numeric filter isIntegerType + def numeric = List(B, S, C, I, L, F, D) + def values = List(U, Z) ++ numeric - def companionBody = - if (isCardinal) cardinalCompanion - else floatingCompanion - } + def make() = values map (x => (x.name, x.make())) } -object AnyVals extends AnyVals { }
\ No newline at end of file +object AnyVals extends AnyVals { } + diff --git a/src/compiler/scala/tools/cmd/gen/Codegen.scala b/src/compiler/scala/tools/cmd/gen/Codegen.scala index d7801f2c08..1bb820455a 100644 --- a/src/compiler/scala/tools/cmd/gen/Codegen.scala +++ b/src/compiler/scala/tools/cmd/gen/Codegen.scala @@ -26,13 +26,7 @@ object Codegen { echo("Generating sources into " + out) if (anyvals || all) { - val av = new AnyVals { - override def timestampString = ( - "// DO NOT EDIT, CHANGES WILL BE LOST.\n" + ( - if (stamp) "// Generated by tools/codegen on " + new java.util.Date + "\n" else "" - ) - ) - } + val av = new AnyVals { } av.make() foreach { case (name, code ) => val file = out / (name + ".scala") toFile; diff --git a/src/compiler/scala/tools/nsc/CompileClient.scala b/src/compiler/scala/tools/nsc/CompileClient.scala index 9987eb0204..fd4f777890 100644 --- a/src/compiler/scala/tools/nsc/CompileClient.scala +++ b/src/compiler/scala/tools/nsc/CompileClient.scala @@ -16,18 +16,21 @@ import sys.SystemProperties.preferIPv4Stack class StandardCompileClient extends HasCompileSocket with CompileOutputCommon { lazy val compileSocket: CompileSocket = CompileSocket - val versionMsg = "Fast " + Properties.versionMsg - var verbose = false + val versionMsg = "Fast " + Properties.versionMsg + var verbose = false def process(args: Array[String]): Int = { - val fscArgs = args.toList - val settings = new FscSettings - val command = new CompilerCommand(fscArgs, settings) - verbose = settings.verbose.value - val shutdown = settings.shutdown.value - val vmArgs = settings.jvmargs.unparse ++ settings.defines.unparse ++ ( - if (settings.preferIPv4.value) List("-D%s=true".format(preferIPv4Stack.key)) else Nil - ) + // Trying to get out in front of the log messages in case we're + // going from verbose to not verbose. + verbose = (args contains "-verbose") + + val settings = new FscSettings(Console.println) + val command = new OfflineCompilerCommand(args.toList, settings) + val shutdown = settings.shutdown.value + val extraVmArgs = if (settings.preferIPv4.value) List("-D%s=true".format(preferIPv4Stack.key)) else Nil + + val vmArgs = settings.jvmargs.unparse ++ settings.defines.unparse ++ extraVmArgs + val fscArgs = args.toList ++ command.extraFscArgs if (settings.version.value) { Console println versionMsg @@ -35,7 +38,8 @@ class StandardCompileClient extends HasCompileSocket with CompileOutputCommon { } info(versionMsg) - info(fscArgs.mkString("[Given arguments: ", " ", "]")) + info(args.mkString("[Given arguments: ", " ", "]")) + info(fscArgs.mkString("[Transformed arguments: ", " ", "]")) info(vmArgs.mkString("[VM arguments: ", " ", "]")) val socket = diff --git a/src/compiler/scala/tools/nsc/CompileServer.scala b/src/compiler/scala/tools/nsc/CompileServer.scala index a34be6226b..866975b414 100644 --- a/src/compiler/scala/tools/nsc/CompileServer.scala +++ b/src/compiler/scala/tools/nsc/CompileServer.scala @@ -21,7 +21,9 @@ import settings.FscSettings */ class StandardCompileServer extends SocketServer { lazy val compileSocket: CompileSocket = CompileSocket + private var compiler: Global = null + private def clearCompiler() = compiler = null var reporter: ConsoleReporter = _ var shutdown = false @@ -58,7 +60,7 @@ class StandardCompileServer extends SocketServer { (totalMemory - freeMemory).toDouble / maxMemory.toDouble > MaxCharge } - protected def newOfflineCompilerCommand(arguments: List[String], settings: Settings) = + protected def newOfflineCompilerCommand(arguments: List[String], settings: FscSettings): OfflineCompilerCommand = new OfflineCompilerCommand(arguments, settings) /** Problematically, Settings are only considered equal if every setting @@ -69,7 +71,7 @@ class StandardCompileServer extends SocketServer { * and which do not interestingly influence compilation products. */ def unequalSettings(s1: Settings, s2: Settings): Set[Settings#Setting] = { - val ignoreSettings = Set("-d", "-encoding", "-verbose") + val ignoreSettings = Set("-d", "-encoding", "-currentDir") def trim (s: Settings): Set[Settings#Setting] = ( s.userSetSettings.toSet[Settings#Setting] filterNot (ss => ignoreSettings exists (ss respondsTo _)) ) @@ -80,7 +82,6 @@ class StandardCompileServer extends SocketServer { } def session() { - printMemoryStats() val password = compileSocket getPassword port val guessedPassword = in.readLine() val input = in.readLine() @@ -92,29 +93,34 @@ class StandardCompileServer extends SocketServer { if (input == null || password != guessedPassword) return - val args = input.split("\0", -1).toList - val settings = new FscSettings(fscError) - val command = newOfflineCompilerCommand(args, settings) + val args = input.split("\0", -1).toList + val newSettings = new FscSettings(fscError) + this.verbose = newSettings.verbose.value + val command = newOfflineCompilerCommand(args, newSettings) + + info("Settings after normalizing paths: " + newSettings) + printMemoryStats() // Update the idle timeout if given - if (!settings.idleMins.isDefault) { - val mins = settings.idleMins.value + if (!newSettings.idleMins.isDefault) { + val mins = newSettings.idleMins.value if (mins == 0) echo("Disabling idle timeout on compile server.") else echo("Setting idle timeout to " + mins + " minutes.") this.idleMinutes = mins } - if (settings.shutdown.value) { + if (newSettings.shutdown.value) { shutdown = true return out.println("[Compile server exited]") } - if (settings.reset.value) { - compiler = null - return out.println("[Compile server was reset]") + if (newSettings.reset.value) { + clearCompiler() + out.println("[Compile server was reset]") + if (command.files.isEmpty) + return } - this.verbose = settings.verbose.value - reporter = new ConsoleReporter(command.settings, in, out) { + reporter = new ConsoleReporter(newSettings, in, out) { // disable prompts, so that compile server cannot block override def displayPrompt = () } @@ -124,7 +130,7 @@ class StandardCompileServer extends SocketServer { info("[Compiler version: " + Properties.versionString + ".]") return false } - val unequal = unequalSettings(command.settings, compiler.settings) + val unequal = unequalSettings(newSettings, compiler.settings) if (unequal.nonEmpty) { info("[Replacing compiler with new instance because settings are unequal.]") info("[Asymmetric settings: " + unequal.mkString(", ") + "]") @@ -133,24 +139,26 @@ class StandardCompileServer extends SocketServer { } if (command.shouldStopWithInfo) - reporter.info(null, command.getInfoMessage(newGlobal(command.settings, reporter)), true) + reporter.info(null, command.getInfoMessage(newGlobal(newSettings, reporter)), true) else if (command.files.isEmpty) reporter.info(null, command.usageMsg, true) else { if (isCompilerReusable) { - compiler.settings = command.settings + info("[Reusing existing Global instance.]") + compiler.settings = newSettings compiler.reporter = reporter } else { - compiler = newGlobal(command.settings, reporter) + compiler = newGlobal(newSettings, reporter) } val c = compiler try new c.Run() compile command.files catch { case ex @ FatalError(msg) => reporter.error(null, "fatal error: " + msg) - compiler = null + clearCompiler() case ex => + warn("Compile server encountered fatal condition: " + ex) shutdown = true throw ex } @@ -158,7 +166,7 @@ class StandardCompileServer extends SocketServer { reporter.printSummary() if (isMemoryFullEnough) { info("Nulling out compiler due to memory utilization.") - compiler = null + clearCompiler() } } } diff --git a/src/compiler/scala/tools/nsc/CompileSocket.scala b/src/compiler/scala/tools/nsc/CompileSocket.scala index 1fd37eb70c..1e2a367176 100644 --- a/src/compiler/scala/tools/nsc/CompileSocket.scala +++ b/src/compiler/scala/tools/nsc/CompileSocket.scala @@ -54,7 +54,7 @@ class CompileSocket extends CompileOutputCommon { * by the port number. */ protected lazy val dirName = "scalac-compile-server-port" - protected lazy val cmdName = Properties.scalaCmd + protected def cmdName = Properties.scalaCmd /** The vm part of the command to start a new scala compile server */ protected val vmCommand = Properties.scalaHome match { diff --git a/src/compiler/scala/tools/nsc/CompilerCommand.scala b/src/compiler/scala/tools/nsc/CompilerCommand.scala index 1c0fd8b9de..c9791b929c 100644 --- a/src/compiler/scala/tools/nsc/CompilerCommand.scala +++ b/src/compiler/scala/tools/nsc/CompilerCommand.scala @@ -26,13 +26,6 @@ class CompilerCommand(arguments: List[String], val settings: Settings) { /** The name of the command */ def cmdName = "scalac" - private def helpSyntaxColumnWidth: Int = - (settings.visibleSettings map (_.helpSyntax.length)) max - - private def format(s: String): String = - if (s.length >= helpSyntaxColumnWidth) s - else s + (" " * (helpSyntaxColumnWidth - s.length)) - private def explainAdvanced = "\n" + """ |-- Notes on option parsing -- |Boolean settings are always false unless set. @@ -44,23 +37,47 @@ class CompilerCommand(arguments: List[String], val settings: Settings) { | example: -Xprint:expl,24-26 prints phases explicitouter, closelim, dce, jvm. | example: -Xprint:-4 prints only the phases up to typer. | - """.stripMargin.trim + "\n\n" + """.stripMargin.trim + "\n" - /** Creates a help message for a subset of options based on cond */ - def createUsageMsg(label: String, shouldExplain: Boolean, cond: Setting => Boolean): String = { - def helpStr(s: Setting) = format(s.helpSyntax) + " " + s.helpDescription + def shortUsage = "Usage: %s <options> <source files>" format cmdName + def createUsagePreface(shouldExplain: Boolean) = + if (shouldExplain) shortUsage + "\n" + explainAdvanced else "" - val usage = "Usage: %s <options> <source files>\n" format cmdName - val explain = if (shouldExplain) explainAdvanced else "" - val prefix = label + " options include:\n " + /** Creates a help message for a subset of options based on cond */ + def createUsageMsg(cond: Setting => Boolean): String = { + val baseList = (settings.visibleSettings filter cond).toList sortBy (_.name) + val width = baseList map (_.helpSyntax.length) max + def format(s: String) = ("%-" + width + "s") format s + def helpStr(s: Setting) = { + val str = format(s.helpSyntax) + " " + s.helpDescription + val suffix = s.deprecationMessage match { + case Some(msg) => "\n" + format("") + " deprecated: " + msg + case _ => "" + } + str + suffix + } + val debugs = baseList filter (_.isForDebug) + val deprecateds = baseList filter (_.isDeprecated) + val theRest = baseList filterNot (debugs.toSet ++ deprecateds) + + def sstring(msg: String, xs: List[Setting]) = + if (xs.isEmpty) None else Some(msg :: xs.map(helpStr) mkString "\n ") + + List( + sstring("", theRest), + sstring("\nAdditional debug settings:", debugs), + sstring("\nDeprecated settings:", deprecateds) + ).flatten mkString "\n" + } - // Separating out any debugging options from others for easier reading - val (debug, rest) = (settings.visibleSettings filter cond).toList sortBy (_.name) partition (_.isForDebug) + def createUsageMsg(label: String, shouldExplain: Boolean, cond: Setting => Boolean): String = { + val prefix = List( + Some(shortUsage), + Some(explainAdvanced) filter (_ => shouldExplain), + Some(label + " options include:") + ).flatten mkString "\n" - (rest map helpStr).mkString(usage + explain + prefix, "\n ", "\n") + ( - if (debug.isEmpty) "" - else (debug map helpStr).mkString("\nAdditional debug settings:\n ", "\n ", "\n") - ) + prefix + createUsageMsg(cond) } /** Messages explaining usage and options */ diff --git a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala index 86ab76b59c..27596dc899 100644 --- a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala +++ b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala @@ -20,8 +20,8 @@ extends CompilerCommand(args, settings) { this(args, str => Console.println("Error: " + str)) /** name of the associated compiler command */ - override val cmdName = "scala" - val compCmdName = "scalac" + override def cmdName = "scala" + def compCmdName = "scalac" // change CompilerCommand behavior override def shouldProcessArguments: Boolean = false @@ -53,10 +53,10 @@ extends CompilerCommand(args, settings) { Usage: @cmd@ <options> [<script|class|object|jar> <arguments>] or @cmd@ -help -All options to @compileCmd@ are also allowed. See @compileCmd@ -help. - """) +All options to @compileCmd@ (see @compileCmd@ -help) are also allowed. +""") - override def usageMsg = shortUsageMsg + "\n" + interpolate(""" + override def usageMsg = shortUsageMsg + interpolate(""" The first given argument other than options to @cmd@ designates what to run. Runnable targets are: diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index 5fd5538660..2e2f9c1ad7 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -661,8 +661,21 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable /** To be initialized from firstPhase. */ private var terminalPhase: Phase = NoPhase - /** Whether compilation should stop at or skip the phase with given name. */ - protected def stopPhase(name: String) = settings.stop contains name + // Calculate where to stop based on settings -Ystop-before or -Ystop-after. + // Slightly complicated logic due to wanting -Ystop-before:parser to fail rather + // than mysteriously running to completion. + private lazy val stopPhaseSetting = { + val result = phaseDescriptors sliding 2 collectFirst { + case xs if xs exists (settings.stopBefore contains _.phaseName) => if (settings.stopBefore contains xs.head.phaseName) xs.head else xs.last + case xs if settings.stopAfter contains xs.head.phaseName => xs.last + } + if (result exists (_.phaseName == "parser")) + globalError("Cannot stop before parser phase.") + + result + } + // The phase to stop BEFORE running. + protected def stopPhase(name: String) = stopPhaseSetting exists (_.phaseName == name) protected def skipPhase(name: String) = settings.skip contains name /** As definitions.init requires phase != NoPhase, and calling phaseDescriptors.head @@ -792,6 +805,12 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable _unitbufSize += 1 // counting as they're added so size is cheap compiledFiles += unit.source.file.path } + private def checkDeprecatedSettings(unit: CompilationUnit) { + // issue warnings for any usage of deprecated settings + settings.userSetSettings filter (_.isDeprecated) foreach { s => + unit.deprecationWarning(NoPosition, s.name + " is deprecated: " + s.deprecationMessage.get) + } + } /* An iterator returning all the units being compiled in this run */ /* !!! Note: changing this to unitbuf.toList.iterator breaks a bunch @@ -868,17 +887,51 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable } } + def reportCompileErrors() { + if (reporter.hasErrors) { + for ((sym, file) <- symSource.iterator) { + sym.reset(new loaders.SourcefileLoader(file)) + if (sym.isTerm) + sym.moduleClass reset loaders.moduleClassLoader + } + } + else { + def warn(count: Int, what: String, option: Settings#BooleanSetting) = ( + if (option.isDefault && count > 0) + warning("there were %d %s warnings; re-run with %s for details".format(count, what, option.name)) + ) + warn(deprecationWarnings, "deprecation", settings.deprecation) + warn(uncheckedWarnings, "unchecked", settings.unchecked) + // todo: migrationWarnings + } + } + /** Compile list of source files */ def compileSources(_sources: List[SourceFile]) { - val depSources = dependencyAnalysis.calculateFiles(_sources.distinct) // bug #1268, scalac confused by duplicated filenames + val depSources = dependencyAnalysis calculateFiles _sources.distinct val sources = coreClassesFirst(depSources) - if (reporter.hasErrors) // there is a problem already, e.g. a plugin was passed a bad option + // there is a problem already, e.g. a plugin was passed a bad option + if (reporter.hasErrors) return - val startTime = currentTime - reporter.reset() - for (source <- sources) addUnit(new CompilationUnit(source)) + // nothing to compile, but we should still report use of deprecated options + if (sources.isEmpty) { + checkDeprecatedSettings(new CompilationUnit(new BatchSourceFile("<no file>", ""))) + reportCompileErrors() + return + } + val startTime = currentTime + reporter.reset(); + { + val first :: rest = sources + val unit = new CompilationUnit(first) + addUnit(unit) + checkDeprecatedSettings(unit) + + for (source <- rest) + addUnit(new CompilationUnit(source)) + } globalPhase = firstPhase if (opt.profileAll) { @@ -947,23 +1000,7 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable if (opt.noShow) showMembers() - if (reporter.hasErrors) { - for ((sym, file) <- symSource.iterator) { - sym.reset(new loaders.SourcefileLoader(file)) - if (sym.isTerm) - sym.moduleClass reset loaders.moduleClassLoader - } - } - else { - def warn(count: Int, what: String, option: Settings#BooleanSetting) = ( - if (option.isDefault && count > 0) - warning("there were %d %s warnings; re-run with %s for details".format(count, what, option.name)) - ) - warn(deprecationWarnings, "deprecation", settings.deprecation) - warn(uncheckedWarnings, "unchecked", settings.unchecked) - // todo: migrationWarnings - } - + reportCompileErrors() symSource.keys foreach (x => resetPackageClass(x.owner)) informTime("total", startTime) @@ -1077,13 +1114,15 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable * */ private def coreClassesFirst(files: List[SourceFile]) = { + val goLast = 4 def rank(f: SourceFile) = { - if (f.file.container.name != "scala") 3 + if (f.file.container.name != "scala") goLast else f.file.name match { case "ScalaObject.scala" => 1 case "LowPriorityImplicits.scala" => 2 case "StandardEmbeddings.scala" => 2 - case _ => 3 + case "Predef.scala" => 3 /* Predef.scala before Any.scala, etc. */ + case _ => goLast } } files sortBy rank diff --git a/src/compiler/scala/tools/nsc/MainGenericRunner.scala b/src/compiler/scala/tools/nsc/MainGenericRunner.scala index 7ead4cce4a..f2d4bacb35 100644 --- a/src/compiler/scala/tools/nsc/MainGenericRunner.scala +++ b/src/compiler/scala/tools/nsc/MainGenericRunner.scala @@ -19,7 +19,7 @@ import GenericRunnerCommand._ * sources for the code to run: pre-compiled code, a script file, * or interactive entry. */ -object MainGenericRunner { +class MainGenericRunner { def errorFn(ex: Throwable): Boolean = { ex.printStackTrace() false @@ -29,11 +29,6 @@ object MainGenericRunner { false } - def main(args: Array[String]) { - if (!process(args)) - sys.exit(1) - } - def process(args: Array[String]): Boolean = { val command = new GenericRunnerCommand(args.toList, (x: String) => errorFn(x)) import command.{ settings, howToRun, thingToRun } @@ -88,3 +83,10 @@ object MainGenericRunner { } } } + +object MainGenericRunner extends MainGenericRunner { + def main(args: Array[String]) { + if (!process(args)) + sys.exit(1) + } +} diff --git a/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala b/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala index 786bcb1eb5..ad45651e23 100644 --- a/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala +++ b/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala @@ -5,10 +5,38 @@ package scala.tools.nsc +import settings.FscSettings +import io.Directory + /** A compiler command for the offline compiler. * * @author Martin Odersky and Lex Spoon */ -class OfflineCompilerCommand(arguments: List[String], settings: Settings) extends CompilerCommand(arguments, settings) { +class OfflineCompilerCommand(arguments: List[String], settings: FscSettings) extends CompilerCommand(arguments, settings) { + import settings.currentDir + def extraFscArgs = List(currentDir.name, currentDir.value) + + locally { + // if -current-dir is unset, we're on the client and need to obtain it. + if (currentDir.isDefault) { + // Prefer env variable PWD to system property user.dir because the former + // deals better with paths not rooted at / (filesystem mounts.) + val baseDirectory = System.getenv("PWD") match { + case null => Directory.Current getOrElse Directory("/") + case dir => Directory(dir) + } + currentDir.value = baseDirectory.path + } + else { + // Otherwise we're on the server and will use it to absolutize the paths. + settings.absolutize(currentDir.value) + } + } + override def cmdName = "fsc" + override def usageMsg = ( + createUsageMsg("where possible fsc", false, x => x.isStandard && settings.isFscSpecific(x.name)) + + "\n\nStandard scalac options also available:" + + createUsageMsg(x => x.isStandard && !settings.isFscSpecific(x.name)) + ) } diff --git a/src/compiler/scala/tools/nsc/ScalaDoc.scala b/src/compiler/scala/tools/nsc/ScalaDoc.scala index 61a3f343e7..a9330b053b 100644 --- a/src/compiler/scala/tools/nsc/ScalaDoc.scala +++ b/src/compiler/scala/tools/nsc/ScalaDoc.scala @@ -6,79 +6,71 @@ package scala.tools.nsc -import java.io.File - -import scala.tools.nsc.reporters.{Reporter, ConsoleReporter} -import scala.tools.nsc.util.FakePos //{Position} +import java.io.File.pathSeparator +import scala.tools.nsc.doc.DocFactory +import scala.tools.nsc.reporters.ConsoleReporter +import scala.tools.nsc.util.FakePos import Properties.msilLibPath -import File.pathSeparator /** The main class for scaladoc, a front-end for the Scala compiler * that generates documentation from source files. */ -object ScalaDoc { - - val versionMsg: String = - "Scaladoc " + - Properties.versionString + " -- " + - Properties.copyrightString - - var reporter: ConsoleReporter = _ - - private def scalacError(msg: String): Unit = { - reporter.error(FakePos("scalac"), msg + "\n scalac -help gives more information") - } - - def process(args: Array[String]): Unit = { - - val docSettings: doc.Settings = - new doc.Settings(scalacError) +class ScalaDoc { + val versionMsg = "Scaladoc %s -- %s".format(Properties.versionString, Properties.copyrightString) + def process(args: Array[String]): Boolean = { + var reporter: ConsoleReporter = null + val docSettings = new doc.Settings(msg => reporter.error(FakePos("scaladoc"), msg + "\n scaladoc -help gives more information")) reporter = new ConsoleReporter(docSettings) { - override def hasErrors = false // need to do this so that the Global instance doesn't trash all the symbols just because there was an error + // need to do this so that the Global instance doesn't trash all the + // symbols just because there was an error + override def hasErrors = false } - - val command = - new CompilerCommand(args.toList, docSettings) - - if (!reporter.hasErrors) { // No need to continue if reading the command generated errors - - if (docSettings.version.value) - reporter.info(null, versionMsg, true) - else if (docSettings.help.value) { - reporter.info(null, command.usageMsg, true) - } - else if (docSettings.Xhelp.value) - reporter.info(null, command.xusageMsg, true) - else if (docSettings.Yhelp.value) - reporter.info(null, command.yusageMsg, true) - else if (docSettings.showPlugins.value) - reporter.warning(null, "Plugins are not available when using Scaladoc") - else if (docSettings.showPhases.value) - reporter.warning(null, "Phases are restricted when using Scaladoc") - else try { - - if (docSettings.target.value == "msil") - msilLibPath foreach (x => docSettings.assemrefs.value += (pathSeparator + x)) - - val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings) - docProcessor.document(command.files) - - } - catch { - case ex @ FatalError(msg) => - if (docSettings.debug.value) ex.printStackTrace(); - reporter.error(null, "fatal error: " + msg) - } - finally { - reporter.printSummary() - } + val command = new ScalaDoc.Command(args.toList, docSettings) + def hasFiles = command.files.nonEmpty || docSettings.uncompilableFiles.nonEmpty + + if (docSettings.version.value) + reporter.info(null, versionMsg, true) + else if (docSettings.Xhelp.value) + reporter.info(null, command.xusageMsg, true) + else if (docSettings.Yhelp.value) + reporter.info(null, command.yusageMsg, true) + else if (docSettings.showPlugins.value) + reporter.warning(null, "Plugins are not available when using Scaladoc") + else if (docSettings.showPhases.value) + reporter.warning(null, "Phases are restricted when using Scaladoc") + else if (docSettings.help.value || !hasFiles) + reporter.info(null, command.usageMsg, true) + else try { + if (docSettings.target.value == "msil") + msilLibPath foreach (x => docSettings.assemrefs.value += (pathSeparator + x)) + + new DocFactory(reporter, docSettings) document command.files } + catch { + case ex @ FatalError(msg) => + if (docSettings.debug.value) ex.printStackTrace() + reporter.error(null, "fatal error: " + msg) + } + finally reporter.printSummary() + + // not much point in returning !reporter.hasErrors when it has + // been overridden with constant false. + true + } +} +object ScalaDoc extends ScalaDoc { + class Command(arguments: List[String], settings: doc.Settings) extends CompilerCommand(arguments, settings) { + override def cmdName = "scaladoc" + override def usageMsg = ( + createUsageMsg("where possible scaladoc", false, x => x.isStandard && settings.isScaladocSpecific(x.name)) + + "\n\nStandard scalac options also available:" + + createUsageMsg(x => x.isStandard && !settings.isScaladocSpecific(x.name)) + ) } - def main(args: Array[String]): Unit = { - process(args) - sys.exit(if (reporter.hasErrors) 1 else 0) + def main(args: Array[String]): Unit = sys exit { + if (process(args)) 0 else 1 } } diff --git a/src/compiler/scala/tools/nsc/ast/DocComments.scala b/src/compiler/scala/tools/nsc/ast/DocComments.scala index d9a2c555e6..2e97a3d820 100755 --- a/src/compiler/scala/tools/nsc/ast/DocComments.scala +++ b/src/compiler/scala/tools/nsc/ast/DocComments.scala @@ -7,6 +7,7 @@ package scala.tools.nsc package ast import symtab._ +import reporters.Reporter import util.{Position, NoPosition} import util.DocStrings._ import util.Chars._ @@ -18,6 +19,8 @@ import scala.collection.mutable.{HashMap, ListBuffer, StringBuilder} */ trait DocComments { self: SymbolTable => + def reporter: Reporter + /** The raw doc comment map */ val docComments = new HashMap[Symbol, DocComment] @@ -129,7 +132,6 @@ trait DocComments { self: SymbolTable => def expandWiki(str: String): String = (str /: wikiReplacements) { (str1, regexRepl) => regexRepl._1 replaceAllIn(str1, regexRepl._2) } - private def getDocComment(sym: Symbol): Option[DocComment] = mapFind(sym :: allInheritedOverriddenSymbols(sym))(docComments get _) @@ -155,13 +157,13 @@ trait DocComments { self: SymbolTable => def merge(src: String, dst: String, sym: Symbol, copyFirstPara: Boolean = false): String = { val srcSections = tagIndex(src) val dstSections = tagIndex(dst) - val srcParams = paramDocs(src, "@param", srcSections) - val dstParams = paramDocs(dst, "@param", dstSections) - val srcTParams = paramDocs(src, "@tparam", srcSections) - val dstTParams = paramDocs(dst, "@tparam", dstSections) - val out = new StringBuilder - var copied = 0 - var tocopy = startTag(dst, dstSections dropWhile (!isMovable(dst, _))) + val srcParams = paramDocs(src, "@param", srcSections) + val dstParams = paramDocs(dst, "@param", dstSections) + val srcTParams = paramDocs(src, "@tparam", srcSections) + val dstTParams = paramDocs(dst, "@tparam", dstSections) + val out = new StringBuilder + var copied = 0 + var tocopy = startTag(dst, dstSections dropWhile (!isMovable(dst, _))) if (copyFirstPara) { val eop = // end of comment body (first para), which is delimited by blank line, or tag, or end of comment @@ -176,10 +178,12 @@ trait DocComments { self: SymbolTable => if (end > tocopy) tocopy = end case None => srcSec match { - case Some((start1, end1)) => + case Some((start1, end1)) => { out append dst.substring(copied, tocopy).trim + out append "\n" copied = tocopy out append src.substring(start1, end1).trim + } case None => } } @@ -210,24 +214,18 @@ trait DocComments { self: SymbolTable => * @param owner The current owner in which variable definitions are searched. * @param site The class for which doc comments are generated */ - def lookupVariable(vble: String, site: Symbol): Option[String] = - if (site == NoSymbol) - None - else { - def lookInBaseClasses = mapFind(site.info.baseClasses)(defs(_).get(vble)) match { - case None => lookupVariable(vble, site.owner) - case someStr => someStr + def lookupVariable(vble: String, site: Symbol): Option[String] = site match { + case NoSymbol => None + case _ => + val searchList = + if (site.isModule) site :: site.info.baseClasses + else site.info.baseClasses + + searchList collectFirst { case x if defs(x) contains vble => defs(x)(vble) } match { + case Some(str) if str startsWith '$' => lookupVariable(str.tail, site) + case res => res orElse lookupVariable(vble, site.owner) } - if (site.isModule) - defs(site).get(vble) match { - case Some(str) => return Some(str) - case None => lookInBaseClasses - } - else lookInBaseClasses - } - - private var expandCount = 0 - private final val expandLimit = 10 + } /** Expand variable occurrences in string `str', until a fix point is reached or * a expandLimit is exceeded. @@ -237,49 +235,57 @@ trait DocComments { self: SymbolTable => * @param site The class for which doc comments are generated * @return Expanded string */ - protected def expandVariables(str: String, sym: Symbol, site: Symbol): String = - if (expandCount < expandLimit) { - try { - val out = new StringBuilder - var copied = 0 - var idx = 0 - while (idx < str.length) { - if ((str charAt idx) == '$') { - val vstart = idx - idx = skipVariable(str, idx + 1) - def replaceWith(repl: String) { - out append str.substring(copied, vstart) - out append repl - copied = idx - } - val vname = variableName(str.substring(vstart + 1, idx)) - if (vname == "super") { - superComment(sym) match { - case Some(sc) => - val superSections = tagIndex(sc) - replaceWith(sc.substring(3, startTag(sc, superSections))) - for (sec @ (start, end) <- superSections) - if (!isMovable(sc, sec)) out append sc.substring(start, end) - case None => + protected def expandVariables(initialStr: String, sym: Symbol, site: Symbol): String = { + val expandLimit = 10 + + def expandInternal(str: String, depth: Int): String = { + if (depth >= expandLimit) + throw new ExpansionLimitExceeded(str) + + val out = new StringBuilder + var copied, idx = 0 + // excluding variables written as \$foo so we can use them when + // necessary to document things like Symbol#decode + def isEscaped = idx > 0 && str.charAt(idx - 1) == '\\' + while (idx < str.length) { + if ((str charAt idx) != '$' || isEscaped) + idx += 1 + else { + val vstart = idx + idx = skipVariable(str, idx + 1) + def replaceWith(repl: String) { + out append str.substring(copied, vstart) + out append repl + copied = idx + } + variableName(str.substring(vstart + 1, idx)) match { + case "super" => + superComment(sym) foreach { sc => + val superSections = tagIndex(sc) + replaceWith(sc.substring(3, startTag(sc, superSections))) + for (sec @ (start, end) <- superSections) + if (!isMovable(sc, sec)) out append sc.substring(start, end) } - } else if (vname.length > 0) { + case "" => idx += 1 + case vname => lookupVariable(vname, site) match { case Some(replacement) => replaceWith(replacement) - case None => //println("no replacement for "+vname) // DEBUG + case None => reporter.warning(sym.pos, "Variable " + vname + " undefined in comment for " + sym) } - } else idx += 1 - } else idx += 1 - } - if (out.length == 0) str - else { - out append str.substring(copied) - expandVariables(out.toString, sym, site) + } } - } finally { - expandCount -= 1 } - } else throw new ExpansionLimitExceeded(str) + if (out.length == 0) str + else { + out append str.substring(copied) + expandInternal(out.toString, depth + 1) + } + } + // We suppressed expanding \$ throughout the recursion, and now we + // need to replace \$ with $ so it looks as intended. + expandInternal(initialStr, 0).replaceAllLiterally("""\$""", "$") + } // !!! todo: inherit from Comment? case class DocComment(raw: String, pos: Position = NoPosition) { @@ -290,31 +296,27 @@ trait DocComments { self: SymbolTable => * useCases: all usecase sections (as instances of class UseCase) */ lazy val (template, defines, useCases) = { - val sections = tagIndex(raw, idx => - startsWithTag(raw, idx, "@define") || startsWithTag(raw, idx, "@usecase")) - val (defines, usecases) = sections partition (startsWithTag(raw, _, "@define")) - val end = startTag(raw, sections) - /* - println("processing doc comment:") - println(raw) - println("===========>") - println(raw.substring(0, end)) - println("++++++++++++++++") - println(sections map { case (s, e) => raw.substring(s, e) }) - */ + val sections = tagIndex(raw) + + val defines = sections filter { startsWithTag(raw, _, "@define") } + val usecases = sections filter { startsWithTag(raw, _, "@usecase") } + + val end = startTag(raw, (defines ::: usecases).sort(_._1 < _._1)) + (if (end == raw.length - 2) raw else raw.substring(0, end) + "*/", defines map { case (start, end) => raw.substring(start, end) }, usecases map { case (start, end) => decomposeUseCase(start, end) }) } private def decomposeUseCase(start: Int, end: Int): UseCase = { - val codeStart = skipWhitespace(raw, start + "@usecase".length) - val codeEnd = skipToEol(raw, codeStart) - val code = raw.substring(codeStart, codeEnd) - val codePos = subPos(codeStart, codeEnd) + val codeStart = skipWhitespace(raw, start + "@usecase".length) + val codeEnd = skipToEol(raw, codeStart) + val code = raw.substring(codeStart, codeEnd) + val codePos = subPos(codeStart, codeEnd) val commentStart = skipLineLead(raw, codeEnd + 1) min end - val comment = "/** " + raw.substring(commentStart, end) + "*/" - val commentPos = subPos(commentStart, end) + val comment = "/** " + raw.substring(commentStart, end) + "*/" + val commentPos = subPos(commentStart, end) + UseCase(DocComment(comment, commentPos), code, codePos) } @@ -329,14 +331,11 @@ trait DocComments { self: SymbolTable => def defineVariables(sym: Symbol) { for (str <- defines) { val start = skipWhitespace(str, "@define".length) - var idx = skipVariable(str, start) - val vble = variableName(str.substring(start, idx)) - if (idx < str.length && isWhitespace(str charAt idx)) idx += 1 - var end = str.lastIndexOf('\n') - if (end == -1) end = str.length - defs(sym) += vble -> str.substring(idx, end) + var idx = skipVariable(str, start) + val vble = variableName(str.substring(start, idx)) + + defs(sym) += vble -> (str drop idx).trim.replaceAll("""\s+\*+$""", "") } - //if (defs(sym).nonEmpty) println("vars of "+sym+" = "+defs(sym)) // !!! } } @@ -372,18 +371,18 @@ trait DocComments { self: SymbolTable => } } val parts = getParts(0) - assert(parts.length > 0, "parts is empty '" + str + "' in site " + site) - val partnames = (parts.init map newTermName) ::: List(newTypeName(parts.last)) - val (start, rest) = - if (parts.head == "this") - (site.thisType, partnames.tail) - else if (parts.tail.nonEmpty && parts(1) == "this") - site.ownerChain.find(_.name.toString == parts.head) match { - case Some(clazz) => (clazz.thisType, partnames.drop(2)) - case None => (NoType, List()) + assert(parts.nonEmpty, "parts is empty '" + str + "' in site " + site) + val partnames = (parts.init map newTermName) :+ newTypeName(parts.last) + val (start, rest) = parts match { + case "this" :: _ => (site.thisType, partnames.tail) + case _ :: "this" :: _ => + site.ownerChain.find(_.name == partnames.head) match { + case Some(clazz) => (clazz.thisType, partnames drop 2) + case _ => (NoType, Nil) } - else + case _ => (getSite(partnames.head), partnames.tail) + } (start /: rest)(select(_, _, NoType)) } @@ -429,4 +428,4 @@ trait DocComments { self: SymbolTable => } class ExpansionLimitExceeded(str: String) extends Exception -}
\ No newline at end of file +} diff --git a/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala b/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala index 436eb5fb90..bfd5b175a7 100644 --- a/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala +++ b/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala @@ -90,8 +90,6 @@ abstract class ScalaPrimitives { // Any operations final val IS = 80 // x.is[y] final val AS = 81 // x.as[y] - final val ISERASED = 85 // x.is$erased[y] - final val ASERASED = 86 // x.as$erased[y] final val HASH = 87 // x.## // AnyRef operations diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 64170482ce..249aefb10e 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -1153,7 +1153,7 @@ abstract class GenICode extends SubComponent { ctx.bb.emit(DROP(from)) ctx.bb.emit(CONSTANT(Constant(null))) } - else if (from == ThrowableReference) { + else if (from == ThrowableReference && !(ThrowableClass.tpe <:< to.toType)) { log("Inserted check-cast on throwable to " + to + " at " + pos) ctx.bb.emit(CHECK_CAST(to)) } diff --git a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala index 076a59ce46..a38916b8e4 100644 --- a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala +++ b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala @@ -15,6 +15,7 @@ import scala.tools.nsc.symtab._ import ch.epfl.lamp.compiler.msil.{Type => MsilType, _} import ch.epfl.lamp.compiler.msil.emit._ +import ch.epfl.lamp.compiler.msil.util.PECustomMod abstract class GenMSIL extends SubComponent { import global._ @@ -250,10 +251,33 @@ abstract class GenMSIL extends SubComponent { } } + /** + * Mutates `member` adding CLR attributes (if any) based on sym.annotations. + * Please notice that CLR custom modifiers are a different beast (see customModifiers below) + * and thus shouldn't be added by this method. + */ def addAttributes(member: ICustomAttributeSetter, annotations: List[AnnotationInfo]) { + val attributes = annotations.map(_.atp.typeSymbol).collect { + case definitions.TransientAttr => null // TODO this is just an example + } return // TODO: implement at some point } -/* + + /** + * What's a CLR custom modifier? Intro available as source comments in compiler.msil.CustomModifier. + * It's basically a marker associated with a location (think of FieldInfo, ParameterInfo, and PropertyInfo) + * and thus that marker (be it optional or required) becomes part of the signature of that location. + * Some annotations will become CLR attributes (see addAttributes above), others custom modifiers (this method). + */ + def customModifiers(annotations: List[AnnotationInfo]): Array[CustomModifier] = { + annotations.map(_.atp.typeSymbol).collect { + case definitions.VolatileAttr => new CustomModifier(true, CustomModifier.VolatileMarker) + } toArray + } + + + + /* if (settings.debug.value) log("creating annotations: " + annotations + " for member : " + member) for (annot@ AnnotationInfo(typ, annArgs, nvPairs) <- annotations ; @@ -810,6 +834,9 @@ abstract class GenMSIL extends SubComponent { fields(field) = fInfo fInfo } + if (fieldInfo.IsVolatile) { + mcode.Emit(OpCodes.Volatile) + } if (!fieldInfo.IsLiteral) { if (loadAddr) { mcode.Emit(if (isStatic) OpCodes.Ldsflda else OpCodes.Ldflda, fieldInfo) @@ -848,7 +875,7 @@ abstract class GenMSIL extends SubComponent { } else if (typ == clrTypes.FLOAT) { mcode.Emit(OpCodes.Ldc_R4, value.asInstanceOf[Float]) } else if (typ == clrTypes.DOUBLE) { - mcode.Emit(OpCodes.Ldc_R4, value.asInstanceOf[Double]) + mcode.Emit(OpCodes.Ldc_R8, value.asInstanceOf[Double]) } else { /* TODO one more case is described in Partition II, 16.2: bytearray(...) */ abort("Unknown type for static literal field: " + fieldInfo) @@ -1864,7 +1891,12 @@ abstract class GenMSIL extends SubComponent { log("Adding field: " + sym.fullName) var attributes = msilFieldFlags(sym) - val fBuilder = mtype.DefineField(msilName(sym), msilType(sym.tpe), attributes) + val fieldTypeWithCustomMods = + new PECustomMod(msilType(sym.tpe), + customModifiers(sym.annotations)) + val fBuilder = mtype.DefineField(msilName(sym), + fieldTypeWithCustomMods, + attributes) fields(sym) = fBuilder addAttributes(fBuilder, sym.annotations) } // all iclass.fields iterated over diff --git a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala index 3e8c9cfea7..b2a93873b0 100644 --- a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala +++ b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala @@ -11,7 +11,7 @@ trait DependencyAnalysis extends SubComponent with Files { val phaseName = "dependencyAnalysis" - def off = settings.make.isDefault + def off = settings.make.isDefault || settings.make.value == "all" def shouldCheckClasspath = settings.make.value != "transitivenocp" def newPhase(prev: Phase) = new AnalysisPhase(prev) @@ -35,9 +35,9 @@ trait DependencyAnalysis extends SubComponent with Files { } lazy val maxDepth = settings.make.value match { - case "changed" => 0 - case "transitive" | "transitivenocp" => Int.MaxValue + case "changed" => 0 case "immediate" => 1 + case _ => Int.MaxValue } // todo: order insensible checking and, also checking timestamp? @@ -176,6 +176,7 @@ trait DependencyAnalysis extends SubComponent with Files { && (tree.symbol != NoSymbol) && (!tree.symbol.isPackage) && (!tree.symbol.isJavaDefined) + && (!tree.symbol.tpe.isError) && ((tree.symbol.sourceFile eq null) || (tree.symbol.sourceFile.path != file.path)) && (!tree.symbol.isClassConstructor)) { diff --git a/src/compiler/scala/tools/nsc/doc/DocFactory.scala b/src/compiler/scala/tools/nsc/doc/DocFactory.scala index c8a6e279ff..71ee6dfcb8 100644 --- a/src/compiler/scala/tools/nsc/doc/DocFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/DocFactory.scala @@ -3,9 +3,11 @@ package scala.tools.nsc package doc +import scala.util.control.ControlThrowable import reporters.Reporter -import java.lang.ClassNotFoundException -import util.{Position, NoPosition} +import util.NoPosition +import io.{ File, Directory } +import DocParser.Parsed /** A documentation processor controls the process of generating Scala documentation, which is as follows. * @@ -25,7 +27,6 @@ import util.{Position, NoPosition} * * @author Gilles Dubochet */ class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor => - /** The unique compiler instance used by this processor and constructed from its `settings`. */ object compiler extends Global(settings, reporter) with interactive.RangePositions { override protected def computeInternalPhases() { @@ -38,64 +39,89 @@ class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor phasesSet += refchecks } override def forScaladoc = true - lazy val addSourceless = { - val sless = new SourcelessComments { val global = compiler } - docComments ++= sless.comments - } } /** Creates a scaladoc site for all symbols defined in this call's `files`, as well as those defined in `files` of * previous calls to the same processor. * @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */ def makeUniverse(files: List[String]): Option[Universe] = { - (new compiler.Run()) compile files - compiler.addSourceless assert(settings.docformat.value == "html") - if (!reporter.hasErrors) { - val modelFactory = (new model.ModelFactory(compiler, settings) with model.comment.CommentFactory with model.TreeFactory) - modelFactory.makeModel match { - case Some(madeModel) => - println("model contains " + modelFactory.templatesCount + " documentable templates") - Some(madeModel) - case None => - println("no documentable class found in compilation units") - None + new compiler.Run() compile files + if (reporter.hasErrors) + return None + + val extraTemplatesToDocument: Set[compiler.Symbol] = { + if (settings.docUncompilable.isDefault) Set() + else { + val uncompilable = new { + val global: compiler.type = compiler + val settings = processor.settings + } with Uncompilable { } + + compiler.docComments ++= uncompilable.comments + docdbg("" + uncompilable) + + uncompilable.templates } } - else None + + val modelFactory = ( + new { override val global: compiler.type = compiler } + with model.ModelFactory(compiler, settings) + with model.comment.CommentFactory + with model.TreeFactory { + override def templateShouldDocument(sym: compiler.Symbol) = + extraTemplatesToDocument(sym) || super.templateShouldDocument(sym) + } + ) + + modelFactory.makeModel match { + case Some(madeModel) => + println("model contains " + modelFactory.templatesCount + " documentable templates") + Some(madeModel) + case None => + println("no documentable class found in compilation units") + None + } + + } + + object NoCompilerRunException extends ControlThrowable { } + + val documentError: PartialFunction[Throwable, Unit] = { + case NoCompilerRunException => + reporter.info(NoPosition, "No documentation generated with unsucessful compiler run", false) + case _: ClassNotFoundException => + () } /** Generate document(s) for all `files` containing scaladoc documenataion. * @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */ def document(files: List[String]): Unit = { + def generate() = { + import doclet._ + val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet + val docletInstance = docletClass.newInstance().asInstanceOf[Generator] - class NoCompilerRunException extends Exception - - try { - val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet - val docletInstance = docletClass.newInstance().asInstanceOf[doclet.Generator] - if (docletInstance.isInstanceOf[doclet.Universer]) { - makeUniverse(files) match { - case Some(universe) => - docletClass.getMethod("setUniverse", classOf[Universe]).invoke(docletInstance, universe) - if (docletInstance.isInstanceOf[doclet.Indexer]) { - val index = model.IndexModelFactory.makeIndex(universe) - docletClass.getMethod("setIndex", classOf[Index]).invoke(docletInstance, index) - } - case None => - throw new NoCompilerRunException() - } + docletInstance match { + case universer: Universer => + val universe = makeUniverse(files) getOrElse { throw NoCompilerRunException } + universer setUniverse universe + + docletInstance match { + case indexer: Indexer => indexer setIndex model.IndexModelFactory.makeIndex(universe) + case _ => () + } + case _ => () } docletInstance.generate } - catch { - case e: ClassNotFoundException => - case e: NoCompilerRunException => - reporter.info(NoPosition, "No documentation generated with unsucessful compiler run", false) - } - - + try generate() + catch documentError + } + private[doc] def docdbg(msg: String) { + if (settings.Ydocdebug.value) + println(msg) } - } diff --git a/src/compiler/scala/tools/nsc/doc/DocParser.scala b/src/compiler/scala/tools/nsc/doc/DocParser.scala new file mode 100644 index 0000000000..1e45079c48 --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/DocParser.scala @@ -0,0 +1,74 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools +package nsc +package doc + +import reporters._ +import util._ +import interactive.RangePositions +import DocParser.Parsed + +/** A very minimal global customized for extracting DocDefs. It stops + * right after parsing so it can read DocDefs from source code which would + * otherwise cause the compiler to go haywire. + */ +class DocParser(settings: nsc.Settings, reporter: Reporter) + extends Global(settings, reporter) + with RangePositions { + + def this(settings: Settings) = this(settings, new ConsoleReporter(settings)) + def this() = this(new Settings(Console println _)) + + // the usual global initialization + locally { new Run() } + + override def forScaladoc = true + override protected def computeInternalPhases() { + phasesSet += syntaxAnalyzer + } + + /** Returns a list of DocParser.Parseds, which hold the DocDefs found in the + * given code along with the surrounding trees. + */ + def docDefs(code: String) = { + def loop(enclosing: List[Tree], tree: Tree): List[Parsed] = tree match { + case x: PackageDef => x.stats flatMap (t => loop(enclosing :+ x, t)) + case x: DocDef => new Parsed(enclosing, x) :: loop(enclosing :+ x.definition, x.definition) + case x => x.children flatMap (t => loop(enclosing, t)) + } + loop(Nil, docUnit(code)) + } + + /** A compilation unit containing parsed source. + */ + def docUnit(code: String) = { + val unit = new CompilationUnit(new BatchSourceFile("<console>", code)) + val scanner = new syntaxAnalyzer.UnitParser(unit) + + scanner.compilationUnit() + } +} + +/** Since the DocParser's whole reason for existing involves trashing a + * global, it is designed to bottle up general Global#Tree types rather + * than path dependent ones. The recipient will have to deal. + */ +object DocParser { + type Tree = Global#Tree + type DefTree = Global#DefTree + type DocDef = Global#DocDef + type Name = Global#Name + + class Parsed(val enclosing: List[Tree], val docDef: DocDef) { + def nameChain: List[Name] = (enclosing :+ docDef.definition) collect { case x: DefTree => x.name } + def raw: String = docDef.comment.raw + + override def toString = ( + nameChain.init.map(x => if (x.isTypeName) x + "#" else x + ".").mkString + nameChain.last + ) + } +} diff --git a/src/compiler/scala/tools/nsc/doc/Settings.scala b/src/compiler/scala/tools/nsc/doc/Settings.scala index 054d16719b..292eca91e3 100644 --- a/src/compiler/scala/tools/nsc/doc/Settings.scala +++ b/src/compiler/scala/tools/nsc/doc/Settings.scala @@ -41,6 +41,17 @@ class Settings(error: String => Unit) extends scala.tools.nsc.Settings(error) { "" ) + val docUncompilable = StringSetting ( + "-doc-no-compile", + "path", + "A directory containing sources which should be parsed, no more (e.g. AnyRef.scala)", + "" + ) + lazy val uncompilableFiles = docUncompilable.value match { + case "" => Nil + case path => io.Directory(path).deepFiles filter (_ hasExtension "scala") toList + } + /** A setting that defines a URL to be concatenated with source locations and show a link to source files. * If needed the sourcepath option can be used to exclude undesired initial part of the link to sources */ val docsourceurl = StringSetting ( @@ -62,11 +73,14 @@ class Settings(error: String => Unit) extends scala.tools.nsc.Settings(error) { "scala.tools.nsc.doc.html.Doclet" ) - // TODO: add a new setting for whether or not to document sourceless entities (e.g., Any, Unit, etc) - // Somewhere slightly before r18708 scaladoc stopped building unless the // self-type check was suppressed. I hijacked the slotted-for-removal-anyway // suppress-vt-warnings option and renamed it for this purpose. noSelfCheck.value = true + // For improved help output. + def scaladocSpecific = Set[Settings#Setting]( + docformat, doctitle, docversion, docUncompilable, docsourceurl, docgenerator + ) + val isScaladocSpecific: String => Boolean = scaladocSpecific map (_.name) } diff --git a/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala b/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala deleted file mode 100644 index 18f8070f14..0000000000 --- a/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala +++ /dev/null @@ -1,249 +0,0 @@ -/* NSC -- new Scala compiler -- Copyright 2007-2011 LAMP/EPFL */ - -package scala.tools.nsc -package doc - -import scala.collection._ - -/** - * A class that provides comments for all symbols which pre-exist in Scala (Any, Nothing, ...) - * It also contains a HashSet of the given symbols - * The comments are to be added to a HashMap called comments, which resides in the Global.scala file - * @author Manohar Jonnalagedda, Stephane Micheloud, Sean McDirmid, Geoffrey Washburn - * @version 1.0 */ -abstract class SourcelessComments { - - val global: Global - - import global._ - import definitions._ - - lazy val comments = { - - val comment = mutable.HashMap.empty[Symbol, DocComment] - - comment(NothingClass) = new DocComment(""" - /** Class `Nothing` is - together with class [[scala.Null]] - at the bottom of Scala's type hierarchy. - * - * Type `Nothing` is a subtype of every other type (including [[scala.Null]]); there exist ''no instances'' of - * this type. Even though type `Nothing` is empty, it is nevertheless useful as a type parameter. For instance, - * the Scala library defines a value [[scala.collection.immutable.Nil]] of type `List[Nothing]`. Because lists - * are covariant in Scala, this makes [[scala.collection.immutable.Nil]] an instance of `List[T]`, for any - * element of type `T`. */ - """) - - comment(NullClass) = new DocComment(""" - /** Class `Null` is - together with class [[scala.Nothing]] - at the bottom of the Scala type hierarchy. - * - * Type `Null` is a subtype of all reference types; its only instance is the `null` reference. Since `Null` is - * not a subtype of value types, `null` is not a member of any such type. For instance, it is not possible to - * assign `null` to a variable of type [[scala.Int]]. */ - """) - - /*******************************************************************/ - /* Documentation for Any */ - - comment(AnyClass) = new DocComment(""" - /** Class `Any` is the root of the Scala class hierarchy. Every class in a Scala execution environment inherits - * directly or indirectly from this class. Class `Any` has two direct subclasses: [[scala.AnyRef]] and - * [[scala.AnyVal]]. */ - """) - - comment(Any_equals) = new DocComment(""" - /** This method is used to compare the receiver object (`this`) with the argument object (`arg0`) for equivalence. - * - * The default implementations of this method is an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence - * relation]: - * * It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`. - * * It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and - * only if `y.equals(x)` returns `true`. - * * It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and - * `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`. - * - * If you override this method, you should verify that your implementation remains an equivalence relation. - * Additionally, when overriding this method it is often necessary to override `hashCode` to ensure that objects - * that are "equal" (`o1.equals(o2)` returns `true`) hash to the same [[scala.Int]] - * (`o1.hashCode.equals(o2.hashCode)`). - * - * @param arg0 the object to compare against this object for equality. - * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */ - """) - - comment(Any_==) = new DocComment(""" - /** `o == arg0` is the same as `o.equals(arg0)`. - * - * @param arg0 the object to compare against this object for equality. - * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */ - """) - - comment(Any_!=) = new DocComment(""" - /** `o != arg0` is the same as `!(o == (arg0))`. - * - * @param arg0 the object to compare against this object for dis-equality. - * @return `false` if the receiver object is equivalent to the argument; `true` otherwise. */ - """) - - comment(Any_toString) = new DocComment(""" - /** Returns a string representation of the object. - * - * The default representation is platform dependent. - * - * @return a string representation of the object. */ - """) - - comment(Any_asInstanceOf) = new DocComment(""" - /** This method is used to cast the receiver object to be of type `T0`. - * - * Note that the success of a cast at runtime is modulo Scala's erasure semantics. Therefore the expression - * `1.asInstanceOf[String]` will throw a `ClassCastException` at runtime, while the expression - * `List(1).asInstanceOf[List[String]]` will not. In the latter example, because the type argument is erased as - * part of compilation it is not possible to check whether the contents of the list are of the requested typed. - * - * @throws ClassCastException if the receiver object is not an instance of erasure of type `T0`. - * @return the receiver object. */ - """) - - comment(Any_isInstanceOf) = new DocComment(""" - /** This method is used to test whether the dynamic type of the receiver object is `T0`. - * - * Note that the test result of the test is modulo Scala's erasure semantics. Therefore the expression - * `1.isInstanceOf[String]` will return `false`, while the expression `List(1).isInstanceOf[List[String]]` will - * return `true`. In the latter example, because the type argument is erased as part of compilation it is not - * possible to check whether the contents of the list are of the requested typed. - * - * @return `true` if the receiver object is an instance of erasure of type `T0`; `false` otherwise. */ - """) - - comment(Any_hashCode) = new DocComment(""" - /** Returns a hash code value for the object. - * - * The default hashing algorithm is platform dependent. - * - * Note that it is allowed for two objects to have identical hash codes (`o1.hashCode.equals(o2.hashCode)`) yet - * not be equal (`o1.equals(o2)` returns `false`). A degenerate implementation could always return `0`. - * However, it is required that if two objects are equal (`o1.equals(o2)` returns `true`) that they have - * identical hash codes (`o1.hashCode.equals(o2.hashCode)`). Therefore, when overriding this method, be sure - * to verify that the behavior is consistent with the `equals` method. - * - * @return the hash code value for the object. */ - """) - - /*******************************************************************/ - /* Documentation for AnyRef */ - - comment(AnyRefClass) = new DocComment(""" - /** Class `AnyRef` is the root class of all ''reference types''. */ - """) - - comment(Object_==) = new DocComment(""" - /** `o == arg0` is the same as `if (o eq null) arg0 eq null else o.equals(arg0)`. - * - * @param arg0 the object to compare against this object for equality. - * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */ - """) - - comment(Object_ne) = new DocComment(""" - /** `o.ne(arg0)` is the same as `!(o.eq(arg0))`. - * - * @param arg0 the object to compare against this object for reference dis-equality. - * @return `false` if the argument is not a reference to the receiver object; `true` otherwise. */ - """) - - - comment(Object_finalize) = new DocComment(""" - /** This method is called by the garbage collector on the receiver object when garbage collection determines that - * there are no more references to the object. - * - * The details of when and if the `finalize` method are invoked, as well as the interaction between `finalize` - * and non-local returns and exceptions, are all platform dependent. */ - """) - - comment(Object_clone) = new DocComment(""" - /** This method creates and returns a copy of the receiver object. - * - * The default implementation of the `clone` method is platform dependent. - * - * @return a copy of the receiver object. */ - """) - - comment(Object_getClass) = new DocComment(""" - /** Returns a representation that corresponds to the dynamic class of the receiver object. - * - * The nature of the representation is platform dependent. - * - * @return a representation that corresponds to the dynamic class of the receiver object. */ - """) - - comment(Object_notify) = new DocComment(""" - /** Wakes up a single thread that is waiting on the receiver object's monitor. */ - """) - - comment(Object_notifyAll) = new DocComment(""" - /** Wakes up all threads that are waiting on the receiver object's monitor. */ - """) - - comment(Object_eq) = new DocComment(""" - /** This method is used to test whether the argument (`arg0`) is a reference to the - * receiver object (`this`). - * - * The `eq` method implements an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation] on - * non-null instances of `AnyRef`: - * * It is reflexive: for any non-null instance `x` of type `AnyRef`, `x.eq(x)` returns `true`. - * * It is symmetric: for any non-null instances `x` and `y` of type `AnyRef`, `x.eq(y)` returns `true` if and - * only if `y.eq(x)` returns `true`. - * * It is transitive: for any non-null instances `x`, `y`, and `z` of type `AnyRef` if `x.eq(y)` returns `true` - * and `y.eq(z)` returns `true`, then `x.eq(z)` returns `true`. - * - * Additionally, the `eq` method has three other properties. - * * It is consistent: for any non-null instances `x` and `y` of type `AnyRef`, multiple invocations of - * `x.eq(y)` consistently returns `true` or consistently returns `false`. - * * For any non-null instance `x` of type `AnyRef`, `x.eq(null)` and `null.eq(x)` returns `false`. - * * `null.eq(null)` returns `true`. - * - * When overriding the `equals` or `hashCode` methods, it is important to ensure that their behavior is - * consistent with reference equality. Therefore, if two objects are references to each other (`o1 eq o2`), they - * should be equal to each other (`o1 == o2`) and they should hash to the same value (`o1.hashCode == o2.hashCode`). - * - * @param arg0 the object to compare against this object for reference equality. - * @return `true` if the argument is a reference to the receiver object; `false` otherwise. */ - """) - - /*******************************************************************/ - - comment(AnyValClass) = new DocComment(""" - /** Class `AnyVal` is the root class of all ''value types''. - * - * `AnyVal` has a fixed number of subclasses, which describe values which are not implemented as objects in the - * underlying host system. - * - * Classes [[scala.Double]], [[scala.Float]], [[scala.Long]], [[scala.Int]], [[scala.Char]], [[scala.Short]], - * and [[scala.Byte]] are together called ''numeric value types''. Classes [[scala.Byte]], [[scala.Short]], and - * [[scala.Char]] are called ''subrange types''. Subrange types, as well as [[scala.Int]] and [[scala.Long]] are - * called ''integer types'', whereas [[scala.Float]] and [[scala.Double]] are called ''floating point types''. */ - """) - - comment(BooleanClass) = new DocComment(""" - /** Class `Boolean` has only two values: `true` and `false`. */ - """) - - comment(UnitClass) = new DocComment(""" - /** Class `Unit` has only one value: `()`. */ - """) - - List(ByteClass, CharClass, DoubleClass, LongClass, FloatClass, IntClass, ShortClass) foreach { sym => - val maxValue = "MAX_" + sym.name.toString().toUpperCase() - val minValue = "MIN_" + sym.name.toString().toUpperCase() - comment(sym) = new DocComment(""" - /** Class `""" + sym.name + """` belongs to the value classes whose instances are not represented as objects by - * the underlying host system. There is an implicit conversion from instances of `""" + sym.name + """` to - * instances of [[scala.runtime.Rich""" + sym.name + """]] which provides useful non-primitive operations. - * All value classes inherit from class [[scala.AnyVal]]. - * - * Values `""" + maxValue + """` and `""" + minValue + """` are defined in object [[scala.Math]]. */ - """) - } - - comment - } - -} diff --git a/src/compiler/scala/tools/nsc/doc/Uncompilable.scala b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala new file mode 100644 index 0000000000..1f0c85361e --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala @@ -0,0 +1,48 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package doc + +/** Some glue between DocParser (which reads source files which can't be compiled) + * and the scaladoc model. + */ +trait Uncompilable { + val global: Global + val settings: Settings + + import global.{ reporter, inform, warning, newTypeName, newTermName, Symbol, Name, DocComment } + import global.definitions.RootClass + + private implicit def translateName(name: Global#Name) = + if (name.isTypeName) newTypeName("" + name) else newTermName("" + name) + + def docSymbol(p: DocParser.Parsed) = p.nameChain.foldLeft(RootClass: Symbol)(_.tpe member _) + def docDefs(code: String) = new DocParser(settings, reporter) docDefs code + def docPairs(code: String) = docDefs(code) map (p => (docSymbol(p), new DocComment(p.raw))) + + lazy val pairs = files flatMap { f => + val comments = docPairs(f.slurp()) + if (settings.verbose.value) + inform("Found %d doc comments in parse-only file %s: %s".format(comments.size, f, comments.map(_._1).mkString(", "))) + + comments + } + def files = settings.uncompilableFiles + def symbols = pairs map (_._1) + def templates = symbols filter (x => x.isClass || x.isTrait) toSet + def comments = { + if (settings.debug.value || settings.verbose.value) + inform("Found %d uncompilable files: %s".format(files.size, files mkString ", ")) + + if (pairs.isEmpty) + warning("no doc comments read from " + settings.docUncompilable.value) + + pairs + } + override def toString = pairs.size + " uncompilable symbols:\n" + ( + symbols map (x => " " + x.owner.fullName + " " + x.defString) mkString "\n" + ) +} diff --git a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala index a14bacb267..f6dc58617e 100644 --- a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala @@ -8,7 +8,6 @@ package doc package html import model._ - import java.io.{ File => JFile } import io.{ Streamable, Directory } import scala.collection._ @@ -17,7 +16,6 @@ import scala.collection._ * @author David Bernard * @author Gilles Dubochet */ class HtmlFactory(val universe: doc.Universe, index: doc.Index) { - /** The character encoding to be used for generated Scaladoc sites. This value is currently always UTF-8. */ def encoding: String = "UTF-8" @@ -50,6 +48,8 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) { copyResource("lib/index.css") copyResource("lib/ref-index.css") copyResource("lib/template.css") + copyResource("lib/arrow-down.png") + copyResource("lib/arrow-right.png") copyResource("lib/class.png") copyResource("lib/class_big.png") copyResource("lib/object.png") diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala index 19372d9e7c..cd733ced9a 100644 --- a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala +++ b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala @@ -29,15 +29,18 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { </xml:group> val valueMembers = - (tpl.methods ::: tpl.values ::: (tpl.templates filter { tpl => tpl.isObject || tpl.isPackage })) sortBy (_.name) + tpl.methods ++ tpl.values ++ tpl.templates.filter(x => x.isObject || x.isPackage) sorted + + val (absValueMembers, concValueMembers) = + valueMembers partition (_.isAbstract) val typeMembers = - (tpl.abstractTypes ::: tpl.aliasTypes ::: (tpl.templates filter { tpl => tpl.isTrait || tpl.isClass })) sortBy (_.name) + tpl.abstractTypes ++ tpl.aliasTypes ++ tpl.templates.filter(x => x.isTrait || x.isClass) sorted val constructors = (tpl match { - case cls: Class => cls.constructors + case cls: Class => (cls.constructors: List[MemberEntity]).sorted case _ => Nil - }) sortBy (_.name) + }) /* for body, there is a special case for AnyRef, otherwise AnyRef appears like a package/object * this problem should be fixed, this implementation is just a patch @@ -51,10 +54,20 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <p id="owner">{ templatesToHtml(tpl.inTemplate.toRoot.reverse.tail, xml.Text(".")) }</p> } - <div id="definition"> - <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/> - <h1>{ if (tpl.isRootPackage) "root package" else tpl.name }</h1> - </div> + { val templateName = if (tpl.isRootPackage) "root package" else tpl.name + val displayName = tpl.companion match { + case Some(companion) => + if (companion.visibility.isPublic && companion.inSource != None) + <a href={relativeLinkTo(companion)} title="go to companion">{ templateName }</a> + else templateName + case _ => + templateName + } + <div id="definition"> + <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/> + <h1>{ displayName }</h1> + </div> + } { signature(tpl, true) } { memberToCommentHtml(tpl, true) } @@ -82,17 +95,11 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <ol><li class="public in">Public</li><li class="all out">All</li></ol> </div> } - { - <div id="impl"> - <span class="filtertype">Impl.</span> - <ol><li class="concrete in">Concrete</li><li class="abstract in">Abstract</li></ol> - </div> - } </div> { if (constructors.isEmpty) NodeSeq.Empty else <div id="constructors" class="members"> - <h3>Instance constructors</h3> + <h3>Instance Constructors</h3> <ol>{ constructors map (memberToHtml(_)) }</ol> </div> } @@ -104,10 +111,17 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { </div> } - { if (valueMembers.isEmpty) NodeSeq.Empty else + { if (absValueMembers.isEmpty) NodeSeq.Empty else + <div id="values" class="values members"> + <h3>Abstract Value Members</h3> + <ol>{ absValueMembers map (memberToHtml(_)) }</ol> + </div> + } + + { if (concValueMembers.isEmpty) NodeSeq.Empty else <div id="values" class="values members"> - <h3>Value Members</h3> - <ol>{ valueMembers map (memberToHtml(_)) }</ol> + <h3>{ if (absValueMembers.isEmpty) "Value Members" else "Concrete Value Members" }</h3> + <ol>{ concValueMembers map (memberToHtml(_)) }</ol> </div> } @@ -183,10 +197,6 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { case dte: DocTemplateEntity if isSelf => // comment of class itself <xml:group> - { if (mbr.comment.isEmpty) NodeSeq.Empty - else - <div class="shortcomment cmt">{ commentToHtml(mbr.comment) }</div> - } <div id="comment" class="fullcomment">{ memberToCommentBodyHtml(mbr, isSelf = true) }</div> </xml:group> case dte: DocTemplateEntity if mbr.comment.isDefined => @@ -198,10 +208,15 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { if (commentBody.isEmpty) NodeSeq.Empty else { - <xml:group> - { memberToShortCommentHtml(mbr, isSelf) } - <div class="fullcomment">{ memberToUseCaseCommentHtml(mbr, isSelf) }{ memberToCommentBodyHtml(mbr, isSelf) }</div> - </xml:group> + val shortComment = memberToShortCommentHtml(mbr, isSelf) + val longComment = memberToUseCaseCommentHtml(mbr, isSelf) ++ memberToCommentBodyHtml(mbr, isSelf) + + val includedLongComment = if (shortComment.text.trim == longComment.text.trim) + NodeSeq.Empty + else + <div class="fullcomment">{ longComment }</div> + + shortComment ++ includedLongComment } } } @@ -225,32 +240,37 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <p class="comment cmt">{ inlineToHtml(mbr.comment.get.short) }</p> def memberToCommentBodyHtml(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = { - NodeSeq.Empty ++ - { if (mbr.comment.isEmpty) NodeSeq.Empty else - <div class="comment cmt">{ commentToHtml(mbr.comment) }</div> - } ++ - { val prs: List[ParameterEntity] = mbr match { + val memberComment = + if (mbr.comment.isEmpty) NodeSeq.Empty + else <div class="comment cmt">{ commentToHtml(mbr.comment) }</div> + + val paramComments = { + val prs: List[ParameterEntity] = mbr match { case cls: Class => cls.typeParams ::: cls.valueParams.flatten case trt: Trait => trt.typeParams case dfe: Def => dfe.typeParams ::: dfe.valueParams.flatten case ctr: Constructor => ctr.valueParams.flatten case _ => Nil } + def mbrCmt = mbr.comment.get + def paramCommentToHtml(prs: List[ParameterEntity]): NodeSeq = prs match { - case Nil => - NodeSeq.Empty + case Nil => NodeSeq.Empty + case (tp: TypeParam) :: rest => val paramEntry: NodeSeq = { <dt class="tparam">{ tp.name }</dt><dd class="cmt">{ bodyToHtml(mbrCmt.typeParams(tp.name)) }</dd> } paramEntry ++ paramCommentToHtml(rest) + case (vp: ValueParam) :: rest => val paramEntry: NodeSeq = { <dt class="param">{ vp.name }</dt><dd class="cmt">{ bodyToHtml(mbrCmt.valueParams(vp.name)) }</dd> } paramEntry ++ paramCommentToHtml(rest) } + if (mbr.comment.isEmpty) NodeSeq.Empty else { val cmtedPrs = prs filter { @@ -258,7 +278,7 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { case vp: ValueParam => mbrCmt.valueParams isDefinedAt vp.name } if (cmtedPrs.isEmpty && mbrCmt.result.isEmpty) NodeSeq.Empty - else + else { <dl class="paramcmts block">{ paramCommentToHtml(cmtedPrs) ++ ( mbrCmt.result match { @@ -267,119 +287,141 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { <dt>returns</dt><dd class="cmt">{ bodyToHtml(cmt) }</dd> }) }</dl> + } } - } ++ - { val fvs: List[comment.Paragraph] = visibility(mbr).toList ::: mbr.flags - if (fvs.isEmpty || isReduced) NodeSeq.Empty else - <div class="block"> - attributes: { fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } } - </div> - } ++ - { tpl.companion match { - case Some(companion) if (isSelf && !isReduced) => - <div class="block"> - go to: <a href={relativeLinkTo(companion)}>companion</a> - </div> - case _ => - NodeSeq.Empty - } - } ++ - { val inDefTpls = mbr.inDefinitionTemplates - if ((inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) || isReduced) NodeSeq.Empty else { - <div class="block"> - definition classes: { templatesToHtml(inDefTpls, xml.Text(" → ")) } - </div> - } - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && !dtpl.linearizationTemplates.isEmpty && !isReduced) => - <div class="block"> - linear super types: { typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = xml.Text(", ")) } - </div> - case _ => NodeSeq.Empty - } - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && !dtpl.subClasses.isEmpty && !isReduced) => - <div class="block"> - known subclasses: { templatesToHtml(dtpl.subClasses, xml.Text(", ")) } - </div> - case _ => NodeSeq.Empty + } + + // --- start attributes block vals + val attributes: Seq[scala.xml.Node] = { + val fvs: List[comment.Paragraph] = visibility(mbr).toList ::: mbr.flags + if (fvs.isEmpty || isReduced) NodeSeq.Empty + else { + <dt>Attributes</dt> + <dd>{ fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } }</dd> } - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && !dtpl.selfType.isEmpty && !isReduced) => - <div class="block"> - self type: { typeToHtml(dtpl.selfType.get, hasLinks = true) } - </div> - case _ => NodeSeq.Empty + } + + val definitionClasses: Seq[scala.xml.Node] = { + val inDefTpls = mbr.inDefinitionTemplates + if ((inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) || isReduced) NodeSeq.Empty + else { + <dt>Definition Classes</dt> + <dd>{ templatesToHtml(inDefTpls, xml.Text(" → ")) }</dd> } - } ++ - { if (!mbr.annotations.isEmpty) { - <div class="block"> - annotations: { + } + + val selfType: Seq[scala.xml.Node] = mbr match { + case dtpl: DocTemplateEntity if (isSelf && !dtpl.selfType.isEmpty && !isReduced) => + <dt>Self Type</dt> + <dd>{ typeToHtml(dtpl.selfType.get, hasLinks = true) }</dd> + case _ => NodeSeq.Empty + } + + val annotations: Seq[scala.xml.Node] = + if (!mbr.annotations.isEmpty) { + <dt>Annotations</dt> + <dd>{ mbr.annotations.map { annot => <xml:group> <span class="name">@{ templateToHtml(annot.annotationClass) }</span>{ argumentsToHtml(annot.arguments) } </xml:group> } } - </div> - } - else NodeSeq.Empty - } ++ - { mbr match { - case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) => - val (absFile, line) = dtpl.inSource.get - <div class="block"> - source: { <a href={ dtpl.sourceUrl.get.toString }>{ Text(absFile.file.getName) }</a> } - </div> - case _ => NodeSeq.Empty + </dd> + } else NodeSeq.Empty + + val sourceLink: Seq[scala.xml.Node] = mbr match { + case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) => + val (absFile, line) = dtpl.inSource.get + <dt>Source</dt> + <dd>{ <a href={ dtpl.sourceUrl.get.toString }>{ Text(absFile.file.getName) }</a> }</dd> + case _ => NodeSeq.Empty + } + + val deprecation: Seq[scala.xml.Node] = + if (mbr.deprecation.isEmpty || isReduced) NodeSeq.Empty + else { + <dt>Deprecated</dt> + <dd class="cmt">{ bodyToHtml(mbr.deprecation.get) }</dd> } - } ++ - { if (mbr.deprecation.isEmpty || isReduced) NodeSeq.Empty else - <div class="block"><ol>deprecated: - { <li class="cmt">{ bodyToHtml(mbr.deprecation.get) }</li> } - </ol></div> - } ++ - { mbr.comment match { - case Some(comment) => - <xml:group> - { if(!comment.example.isEmpty && !isReduced) - <div class="block">Example{ if (comment.example.length > 1) "s" else ""} : + + val mainComment: Seq[scala.xml.Node] = mbr.comment match { + case Some(comment) => + val example = + if(!comment.example.isEmpty && !isReduced) + <div class="block">Example{ if (comment.example.length > 1) "s" else ""} : <ol>{ - val exampleXml: List[scala.xml.NodeSeq] = - for(example <- comment.example ) yield - <li class="cmt">{ bodyToHtml(example) }</li> - exampleXml.reduceLeft(_ ++ Text(", ") ++ _) - }</ol> + val exampleXml: List[scala.xml.NodeSeq] = + for(example <- comment.example ) yield + <li class="cmt">{ bodyToHtml(example) }</li> + exampleXml.reduceLeft(_ ++ Text(", ") ++ _) + }</ol> </div> - else NodeSeq.Empty - } - { if(!comment.version.isEmpty && !isReduced) - <div class="block"><ol>version - { for(body <- comment.version.toList) yield <li class="cmt">{bodyToHtml(body)}</li> } - </ol></div> - else NodeSeq.Empty - } - { if(!comment.since.isEmpty && !isReduced) - <div class="block"><ol>since - { for(body <- comment.since.toList) yield <li class="cmt">{bodyToHtml(body)}</li> } - </ol></div> - else NodeSeq.Empty - } - { if(!comment.see.isEmpty && !isReduced) - <div class="block"><ol>see also: - { val seeXml:List[scala.xml.NodeSeq]=(for(see <- comment.see ) yield <li class="cmt">{bodyToHtml(see)}</li> ) - seeXml.reduceLeft(_ ++ Text(", ") ++ _) - } - </ol></div> - else NodeSeq.Empty - } - </xml:group> - case None => NodeSeq.Empty - } + else NodeSeq.Empty + + val version: Seq[scala.xml.Node] = + if(!comment.version.isEmpty && !isReduced) { + <dt>Version</dt> + <dd>{ for(body <- comment.version.toList) yield {bodyToHtml(body)} }</dd> + } else NodeSeq.Empty + + val sinceVersion: Seq[scala.xml.Node] = + if(!comment.since.isEmpty && !isReduced) { + <dt>Since</dt> + <dd>{ for(body <- comment.since.toList) yield {bodyToHtml(body)} }</dd> + } else NodeSeq.Empty + + val seeAlso: Seq[scala.xml.Node] = + if(!comment.see.isEmpty && !isReduced) { + <dt>See also</dt> + <dd>{ + val seeXml:List[scala.xml.NodeSeq]=(for(see <- comment.see ) yield <span class="cmt">{bodyToHtml(see)}</span> ) + seeXml.reduceLeft(_ ++ Text(", ") ++ _) + }</dd> + } else NodeSeq.Empty + + example ++ version ++ sinceVersion ++ seeAlso + + case None => NodeSeq.Empty + } + // end attributes block vals --- + + val attributesInfo = attributes ++ definitionClasses ++ selfType ++ annotations ++ sourceLink ++ deprecation ++ mainComment + val attributesBlock = + if (attributesInfo.isEmpty) + NodeSeq.Empty + else + <dl class="attributes block"> { attributesInfo }</dl> + + val linearization = mbr match { + case dtpl: DocTemplateEntity if isSelf && !isReduced && dtpl.linearizationTemplates.nonEmpty => + <div class="toggleContainer"> + <div class="attributes block"> + <span class="link showElement">Linear Supertypes</span> + <span class="link hideElement">Linear Supertypes</span> + </div> + <div class="superTypes hiddenContent"> + <p>{ typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = xml.Text(", ")) }</p> + </div> + </div> + case _ => NodeSeq.Empty } + + val subclasses = mbr match { + case dtpl: DocTemplateEntity if isSelf && !isReduced && dtpl.subClasses.nonEmpty => + <div class="toggleContainer"> + <div class="attributes block"> + <span class="link showElement">Known Subclasses</span> + <span class="link hideElement">Known Subclasses</span> + </div> + <div class="subClasses hiddenContent"> + <p>{ templatesToHtml(dtpl.subClasses.sortBy(_.name), xml.Text(", ")) }</p> + </div> + </div> + case _ => NodeSeq.Empty + } + + memberComment ++ paramComments ++ attributesBlock ++ linearization ++ subclasses } def kindToString(mbr: MemberEntity): String = { @@ -427,11 +469,16 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { /** name, tparams, params, result */ def signature(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = { - def inside(hasLinks: Boolean): NodeSeq = + def inside(hasLinks: Boolean, nameLink: String = ""): NodeSeq = <xml:group> <span class="kind">{ kindToString(mbr) }</span> <span class="symbol"> - <span class={"name" + (if (mbr.deprecation.isDefined) " deprecated" else "") }>{ if (mbr.isConstructor) tpl.name else mbr.name }</span> + { + val nameHtml = <span class={"name" + (if (mbr.deprecation.isDefined) " deprecated" else "") }>{ if (mbr.isConstructor) tpl.name else mbr.name }</span> + if (!nameLink.isEmpty) + <a href={nameLink}>{nameHtml}</a> + else nameHtml + } { def tparamsToHtml(mbr: Entity): NodeSeq = mbr match { case hk: HigherKinded => @@ -453,16 +500,14 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = { def param0(vl: ValueParam): NodeSeq = // notice the }{ in the next lines, they are necessary to avoid a undesired withspace in output - <span name={ vl.name }> - { Text(vl.name) } - { Text(": ") ++ typeToHtml(vl.resultType, hasLinks) } - { - vl.defaultValue match { - case Some(v) => Text(" = ") ++ treeToHtml(v) - case None => NodeSeq.Empty - } + <span name={ vl.name }>{ + Text(vl.name) + }{ Text(": ") ++ typeToHtml(vl.resultType, hasLinks) }{ + vl.defaultValue match { + case Some(v) => Text(" = ") ++ treeToHtml(v) + case None => NodeSeq.Empty } - </span> + }</span> def params0(vlss: List[ValueParam]): NodeSeq = vlss match { case Nil => NodeSeq.Empty @@ -482,21 +527,20 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { case _ => NodeSeq.Empty } } - } - { if (isReduced) NodeSeq.Empty else { + }{ if (isReduced) NodeSeq.Empty else { mbr match { - case tpl: DocTemplateEntity if (!tpl.isPackage) => - tpl.parentType match { - case Some(st) => <span class="result"> extends { typeToHtml(st, hasLinks) }</span> - case None =>NodeSeq.Empty - } + case tpl: DocTemplateEntity if tpl.parentType.isDefined => + <span class="result"> extends { typeToHtml(tpl.parentType.get, hasLinks) }</span> + case tme: MemberEntity if (tme.isDef || tme.isVal || tme.isLazyVal || tme.isVar) => <span class="result">: { typeToHtml(tme.resultType, hasLinks) }</span> + case abt: AbstractType => val b2s = boundsToHtml(abt.hi, abt.lo, hasLinks) if (b2s != NodeSeq.Empty) <span class="result">{ b2s }</span> else NodeSeq.Empty + case alt: AliasType => <span class="result"> = { typeToHtml(alt.alias, hasLinks) }</span> case _ => NodeSeq.Empty @@ -506,7 +550,7 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage { </xml:group> mbr match { case dte: DocTemplateEntity if !isSelf => - <h4 class="signature"><a href={ relativeLinkTo(dte) }>{ inside(hasLinks = false) }</a></h4> + <h4 class="signature">{ inside(hasLinks = false, nameLink = relativeLinkTo(dte)) }</h4> case _ if isSelf => <h4 id="signature" class="signature">{ inside(hasLinks = true) }</h4> case _ => diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png Binary files differnew file mode 100644 index 0000000000..7229603ae5 --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png Binary files differnew file mode 100644 index 0000000000..b2f2935dc9 --- /dev/null +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png Binary files differindex 25a8b4c185..97edbd49db 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png Binary files differindex 51e85957fe..1a00abb401 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css index aef3f341aa..7c05678313 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css @@ -20,6 +20,10 @@ h1 { display: none; } +.letters { + padding: 5px; +} + #library { display: none; } @@ -40,7 +44,7 @@ h1 { right: 0; left: 0; top: 0; - background-color: #B78E99; + background-color: #DADADA; } #textfilter { @@ -72,7 +76,7 @@ h1 { height: 16px; padding: 2px; font-weight: bold; - color: #993300; + color: darkblue; background-color: white; width: 100%; } @@ -104,12 +108,19 @@ h1 { } #kindfilter { - position: relative; - display: block; - padding: 5px; - background-color: #F0F8FF; + position: relative; + display: block; + padding: 5px; + background-color: #999; + text-align: center; } + +#kindfilter > a { + color: white; + text-decoration: underline; +} + #tpl { display: block; position: fixed; @@ -127,7 +138,7 @@ h1 { float: right; font-weight: normal; color: white; - padding: 1px 4px 1px 4px; + padding: 0 8px; } #tpl .packfocus { @@ -135,24 +146,34 @@ h1 { float: right; font-weight: normal; color: white; - padding: 1px 0.5em 1px 4px; +} + +#tpl .packages > ol { + /*margin-bottom: 5px;*/ +} + +#tpl .packages > ol > li { + margin-bottom: 1px; } #tpl .packages > li > h3 { display: block; - background-color: #2C475C; color: white; - padding: 1px 4px 1px 0.5em; font-weight: bold; display: block; } +#tpl ol > li.pack { + background-color: #2C475C; + padding: 3px 5px; +} + #tpl ol > li { display: block; } #tpl .templates > li { - padding-left: 0.5em; + padding-left: 5px; } #tpl ol > li .icon { @@ -168,7 +189,7 @@ h1 { } #tpl .templates span.tplLink { - padding-left: 8px; + padding-left: 5px; } #content { diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js index 212844c966..b06d5dc369 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js @@ -227,25 +227,28 @@ function configureTextFilter() { }); } -// Filters all focused templates and packages. This function should be made less-blocking. -// @param query The string of the query -function textFilter() { - scheduler.clear("filter"); +function compilePattern(query) { + var escaped = query.replace(/([\.\*\+\?\|\(\)\[\]\\])/g, '\\$1'); - $('#tpl').html(''); - - var query = $("#textfilter input").attr("value") || ''; - - var queryRegExp; if (query.toLowerCase() != query) { // Regexp that matches CamelCase subbits: "BiSe" is // "[a-z]*Bi[a-z]*Se" and matches "BitSet", "ABitSet", ... - queryRegExp = new RegExp(query.replace(/([A-Z])/g,"[a-z]*$1")); + return new RegExp(escaped.replace(/([A-Z])/g,"[a-z]*$1")); } else { // if query is all lower case make a normal case insensitive search - queryRegExp = new RegExp(query, "i"); + return new RegExp(escaped, "i"); } +} +// Filters all focused templates and packages. This function should be made less-blocking. +// @param query The string of the query +function textFilter() { + scheduler.clear("filter"); + + $('#tpl').html(''); + + var query = $("#textfilter input").attr("value") || ''; + var queryRegExp = compilePattern(query); var index = 0; diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png Binary files differindex 886cd5c7c3..ad312793ea 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png Binary files differindex 0a483cacf5..d51c797047 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png Binary files differindex c3eef6ea51..6ea17ac320 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png Binary files differindex 5ab05cc6ac..529aa93188 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css index 687fe4634c..7957aebe8f 100755 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css @@ -16,13 +16,15 @@ a { } .entry { - + border-bottom: 1px solid lightgray; + padding: 5px 0 8px; } .name { - background-color:#E5E5E5; + /* background-color:#E5E5E5; */ } .occurrences { - margin-left:0.7em + margin-left: 1em; + margin-top: 5px; }
\ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css index 13ccadefe5..192a56f9bb 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css @@ -16,10 +16,6 @@ table, caption, tbody, tfoot, thead, tr, th, td { vertical-align: baseline; } -body { - line-height: 1.2; -} - table { border-collapse: separate; border-spacing: 0; } caption, th, td { text-align: left; font-weight: normal; } table, td, th { vertical-align: middle; } @@ -40,7 +36,7 @@ body { a[href] { text-decoration: underline; - color: #69481D; /* brown */ + color: #315479; } a[href]:hover { @@ -48,7 +44,7 @@ a[href]:hover { } #owner { - padding: 4px; + padding: 2px 10px 5px; font-size: 12pt; display: block; } @@ -58,16 +54,20 @@ a[href]:hover { } .value #owner { - background-color: #7996AC; + background-color: #7996AC; /* light steel gray */ } .type #owner { - background-color: #799F5A; + background-color: #699D84; /* lighter green */ +} + +#types ol li > p { + margin-top: 5px; } #definition { display: block; - padding: 6px; + padding: 5px 6px; } #definition > img { @@ -81,65 +81,111 @@ a[href]:hover { display: inline-block; } +#definition h1 > a { + color: white; + font-size: 24pt; +} + +#signature { + background-color: #EBEBEB; + font-size: 11.5pt; + margin-bottom: 10px; + padding: 8px; +} + #signature > span.kind { - font-size: 11pt; display: inline; float: left; text-align: left; width: auto; - padding-left: 6px; + position: static; } #signature > span.symbol { - font-size: 11pt; text-align: left; + display: inline; + padding-left: 0.7em; +} + +/* Linear super types and known subclasses */ +.hideElement, +.hiddenContent { + display: none; +} + +div.superTypes > h1 { + font-style: italic; + padding-top: 0.5em; +} + +.link { + text-decoration: underline; + cursor: pointer; + color: #315479; +} + +.toggleContainer p { + margin-top: 5px; +} + +.toggleContainer .showElement { + padding-left: 15px; + background: url("arrow-right.png") no-repeat 0 5px transparent; +} + +.toggleContainer .hideElement { + padding-left: 15px; + background: url("arrow-down.png") no-repeat 0 5px transparent; } .value #definition { - background-color: #2C475C; + background-color: #2C475C; /* blue */ } .type #definition { - background-color: #385E1A; + background-color: #316555; /* green */ } -#comment { - display:none; - padding-right: 8px; - padding-left: 8px; +#template { + margin-bottom: 50px; } -#template .values > h3 { +h3 { color: white; - padding: 4px; - background-color: #7996AC; + padding: 5px 10px; font-size: 12pt; font-weight: bold; } +dl.attributes > dt { + display: block; + float: left; + font-style: italic; +} + +dl.attributes > dd { + display: block; + padding-left: 10em; + margin-bottom: 5px; +} + +#template .values > h3 { + background-color: #315479; /* grayish blue */ +} + #template .types > h3 { - padding: 4px; - color: white; - font-weight: bold; - font-size: 12pt; - background-color: #799F5A; + background-color: #316555; /* green */ } #constructors > h3 { - padding: 4px; - color: white; - font-weight: bold; - font-size: 12pt; background-color: #333; } #template > div.parent > h3 { - color: white; - padding: 4px; + background-color: #3B3B3B; margin-top: 10px; - background-color: #47166D; + font-style: italic; font-size: 12pt; - font-weight: bold; } #template > div.parent > h3 * { @@ -155,6 +201,15 @@ div.members > ol { div.members > ol > li { display: block; + border-bottom: 1px solid gray; + padding: 5px 0 6px; + margin: 0 10px; + position: relative; +} + +div.members > ol > li:last-child { + border: 0; + padding: 5px 0 5px; } /* Member signatures */ @@ -169,18 +224,16 @@ div.members > ol > li { } .signature { - padding: 2px; font-family: monospace; font-size: 10pt; + line-height: 18px; clear: both; display: block; - background-color: #E5E5E5; } .signature .kind { + position: absolute; text-align: right; - float: left; - display: inline-block; width: 8em; } @@ -197,8 +250,8 @@ div.members > ol > li { } .signature .symbol { - display: inline; - padding-left: 0.7em; + display: block; + padding-left: 8.7em; } .signature .name { @@ -218,12 +271,22 @@ div.members > ol > li { font-style: italic; } +#template .signature.closed { + background: url("arrow-right.png") no-repeat 0 5px transparent; + cursor: pointer; +} + +#template .signature.opened { + background: url("arrow-down.png") no-repeat 0 5px transparent; + cursor: pointer; +} + #template .values .signature .name { - color: blue; + color: darkblue; } #template .types .signature .name { - color: green; + color: darkgreen; } /* Comments text formating */ @@ -231,54 +294,49 @@ div.members > ol > li { .cmt {} .cmt p { - margin-bottom: 0.9em; - margin-top: 0.9em; + margin: 0.7em 0; } -.cmt h3 { - margin-bottom: 1em; - margin-top: 1em; +.cmt p:first-child { + margin-top: 0; +} + +.cmt p:last-child { + margin-bottom: 0; +} + +.cmt h3, +.cmt h4, +.cmt h5, +.cmt h6 { + margin-bottom: 0.7em; + margin-top: 1.4em; display: block; text-align: left; font-weight: bold; - font-size: x-large; +} + +.cmt h3 { + font-size: 14pt; } .cmt h4 { - margin-bottom: 0.6em; - margin-top: 0.6em; - display: block; - text-align: left; - font-weight: bold; - font-size: large; + font-size: 13pt; } .cmt h5 { - margin-bottom: 0.4em; - margin-top: 0.4em; - display: block; - text-align: left; - font-weight: bold; + font-size: 12pt; } .cmt h6 { - margin-bottom: 0.4em; - margin-top: 0.4em; - display: block; - text-align: left; - font-style: italic; + font-size: 11pt; } .cmt pre { - padding: 0.4em; - border-color: #ddd; - border-style: solid; - border-width: 1px; - margin-left: 0; - margin-bottom: 0.4em; - margin-right: 0; - margin-top: 0.4em; + padding: 5px; + border: 1px solid #ddd; background-color: #eee; + margin: 5px 0; display: block; font-family: monospace; } @@ -286,7 +344,7 @@ div.members > ol > li { .cmt ul { display: block; list-style: circle; - padding-left:20px; + padding-left: 20px; } .cmt ol { @@ -315,7 +373,7 @@ div.members > ol > li { } .cmt li { - display:list-item; + display: list-item; } .cmt code { @@ -339,35 +397,32 @@ div.members > ol > li { p.comment { display: block; margin-left: 8.7em; + margin-top: 5px; } .shortcomment { display: block; - cursor: pointer; - margin: 4px 0px; - padding: 0 8px; + margin: 5px 10px; } div.fullcomment { - margin: 10px 0 10px 0; + margin: 5px 10px; } #template div.fullcomment { display:none; - margin: 6px 0 6px 8.7em; + margin: 5px 0 0 8.7em; } #template .shortcomment { - margin: 0 0 0 8.7em; - padding: 2px; + margin: 5px 0 0 8.7em; + padding: 0; } div.fullcomment .block { - padding: 2px 0 2px 0; - border-top: 1px solid gray; - border-bottom: 1px solid gray; - margin-top: 2px; - margin-bottom: 2px; + padding: 5px 0 0; + border-top: 1px solid #EBEBEB; + margin-top: 5px; } div.fullcomment div.block ol li p, @@ -375,10 +430,6 @@ div.fullcomment div.block ol li { display:inline } -div.fullcomment .block + .block { - border-top: none; -} - div.fullcomment .block > h5 { font-style: italic; font-weight: normal; @@ -386,39 +437,25 @@ div.fullcomment .block > h5 { } div.fullcomment .comment { - margin: 6px 0 6px 0; + margin: 5px 0 10px; +} + +div.fullcomment .comment:last-child { + margin-bottom: 0; } div.fullcomment dl.paramcmts > dt { display: block; float: left; font-weight: bold; - margin: 2px 4px 2px 0; } div.fullcomment dl.paramcmts > dd { display: block; padding-left: 80px; - border-top: 1px dashed gray; - border-bottom: 1px dashed gray; + margin-bottom: 5px; } -div.fullcomment dl.paramcmts > dt:first-child + dd { - border-top: none; -} - -div.fullcomment dl.paramcmts > dd:last-child { - border-bottom: none; -} - -div.fullcomment dl.paramcmts > dd + dt + dd { - border-top: none; -} - -div.fullcomment dl.paramcmts dd.cmt p { - margin-top: 2px; - margin-bottom: 2px; -} /* Members filter tool */ #textfilter { @@ -466,31 +503,43 @@ div.fullcomment dl.paramcmts dd.cmt p { } #mbrsel { - padding: 4px; - background-color: #B78E99; /* grayish pink */ + padding: 5px 10px; + background-color: #DADADA; /* light gray */ + font-size: 9.5pt; display: block; - margin-bottom: 10px; + margin-top: 1em; +/* margin-bottom: 1em; */ +} + +#mbrsel > div { + margin-bottom: 5px; +} + +#mbrsel > div:last-child { + margin-bottom: 0; } #mbrsel > div > span.filtertype { - padding: 4px; + padding: 3px 0; float: left; display: inline-block; - color: white; + color: #404040; width: 4.5em; } #mbrsel > div > ol { display: inline-block; - background-color: white; + /*background-color: white;*/ } #mbrsel > div > ol#linearization { - display: inline; + display: block; + margin-left: 4.5em; + margin-top: 5px; } #mbrsel > div > ol > li { - padding: 4px 8px 4px 8px; + padding: 3px 10px; background-color: white; display: inline-block; cursor: pointer; @@ -502,8 +551,8 @@ div.fullcomment dl.paramcmts dd.cmt p { } #mbrsel > div > ol > li.out { - color: #80384E; - background-color: #9E6A77; + color: #4B4B4B; + background-color: #999; } #mbrsel .hideall { diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js index ef98c13aaf..14a5613015 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js @@ -69,24 +69,6 @@ $(document).ready(function(){ filter(); }; }); - $("#impl > ol > li.concrete").click(function() { - if ($(this).hasClass("out")) { - $(this).removeClass("out").addClass("in"); - $("li[data-isabs='false']").show(); - } else { - $(this).removeClass("in").addClass("out"); - $("li[data-isabs='false']").hide(); - } - }); - $("#impl > ol > li.abstract").click(function() { - if ($(this).hasClass("out")) { - $(this).removeClass("out").addClass("in"); - $("li[data-isabs='true']").show(); - } else { - $(this).removeClass("in").addClass("out"); - $("li[data-isabs='true']").hide(); - } - }); $("#order > ol > li.alpha").click(function() { if ($(this).hasClass("out")) { $(this).removeClass("out").addClass("in"); @@ -119,44 +101,47 @@ $(document).ready(function(){ $(this.getTip()).html(this.getTrigger().attr("name")) } }); - var docAllSigs = $(".signature"); - function commentShowFct(fullComment){ + + /* Add toggle arrows */ + var docAllSigs = $("#template li").has(".fullcomment").find(".signature"); + + function commentToggleFct(signature){ + var parent = signature.parent(); + var shortComment = $(".shortcomment", parent); + var fullComment = $(".fullcomment", parent); var vis = $(":visible", fullComment); + signature.toggleClass("closed").toggleClass("opened"); if (vis.length > 0) { + shortComment.slideDown(100); fullComment.slideUp(100); } else { + shortComment.slideUp(100); fullComment.slideDown(100); } }; - var docShowSigs = docAllSigs.filter(function(){ - return $("+ div.fullcomment", $(this)).length > 0; - }); - docShowSigs.css("cursor", "pointer"); - docShowSigs.click(function(){ - commentShowFct($("+ div.fullcomment", $(this))); + docAllSigs.addClass("closed"); + docAllSigs.click(function() { + commentToggleFct($(this)); }); - function commentToggleFct(shortComment){ - var vis = $("~ div.fullcomment:visible", shortComment); - if (vis.length > 0) { - shortComment.slideDown(100); - vis.slideUp(100); - } - else { - var hid = $("~ div.fullcomment:hidden", shortComment); - hid.slideDown(100); - shortComment.slideUp(100); - } + + /* Linear super types and known subclasses */ + function toggleShowContentFct(outerElement){ + var content = $(".hiddenContent", outerElement); + var vis = $(":visible", content); + if (vis.length > 0) { + content.slideUp(100); + $(".showElement", outerElement).show(); + $(".hideElement", outerElement).hide(); + } + else { + content.slideDown(100); + $(".showElement", outerElement).hide(); + $(".hideElement", outerElement).show(); + } }; - var docToggleSigs = docAllSigs.filter(function(){ - return $("+ .shortcomment", $(this)).length > 0; - }); - docToggleSigs.css("cursor", "pointer"); - docToggleSigs.click(function(){ - commentToggleFct($("+ .shortcomment", $(this))); - }); - $(".shortcomment").click(function(){ - commentToggleFct($(this)); + $(".toggleContainer").click(function() { + toggleShowContentFct($(this)); }); }); diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png Binary files differindex b3871a01c4..fb961a2eda 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png Binary files differindex a44871309e..0159946d46 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai index b56fd1d3cd..3b5c47c9e3 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai @@ -1,7 +1,7 @@ %PDF-1.5
%âãÏÓ
-1 0 obj
<</Metadata 1054 0 R/Pages 2 0 R/OCProperties<</D<</RBGroups[]/ON[37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R]/OFF[15 0 R 27 0 R]/Order 970 0 R>>/OCGs[15 0 R 27 0 R 37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R]>>/Type/Catalog>>
endobj
1054 0 obj
<</Subtype/XML/Length 44482/Type/Metadata>>stream
+1 0 obj
<</Metadata 1054 0 R/OCProperties<</D<</OFF[15 0 R 27 0 R]/ON[37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R]/Order 1314 0 R/RBGroups[]>>/OCGs[15 0 R 27 0 R 37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R]>>/Pages 2 0 R/Type/Catalog>>
endobj
1054 0 obj
<</Length 44567/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> -<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 "> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -13,32 +13,33 @@ </dc:title> </rdf:Description> <rdf:Description rdf:about="" - xmlns:xap="http://ns.adobe.com/xap/1.0/" - xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> - <xap:CreatorTool>Adobe Illustrator CS3</xap:CreatorTool> - <xap:CreateDate>2009-11-23T17:10:12+01:00</xap:CreateDate> - <xap:ModifyDate>2010-04-13T20:05:12+02:00</xap:ModifyDate> - <xap:MetadataDate>2010-04-13T20:05:12+02:00</xap:MetadataDate> - <xap:Thumbnails> + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xmp:CreatorTool>Adobe Illustrator CS3</xmp:CreatorTool> + <xmp:CreateDate>2009-11-23T17:10:12+01:00</xmp:CreateDate> + <xmp:ModifyDate>2011-04-04T19:44:30+02:00</xmp:ModifyDate> + <xmp:MetadataDate>2011-04-04T19:44:30+02:00</xmp:MetadataDate> + <xmp:Thumbnails> <rdf:Alt> <rdf:li rdf:parseType="Resource"> - <xapGImg:width>256</xapGImg:width> - <xapGImg:height>208</xapGImg:height> - <xapGImg:format>JPEG</xapGImg:format> - <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynba
/PLB5FuryZPMPpsVR5FjD2aSlP3nAujk022r1C5k6fka+ro1ZOl8kH+VVxocf5iarp3kyXn5TTTI
p9Sht3kmso9WaUKPRklHL4oVbcfap/kilmckwBl9V/YjH9W3J7DmE3OxV2KuxV2KuxV2KuxV2KpD
5s89eU/KUNvN5h1BLFbpylupWSV3KirFY4ld+K7ValBUeIycMcp8gxlIDmivLfmfQfMumDU9DvFv
bIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlA0UxkDyTTIJdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVU7m2t7q3ltrmJJ7eZTHNDIodHRhRlZWqCCOoOEGlU9P03TtNtEs9OtYbKzir6dtbx
rFEvIljxRAFFSSTiZE7lAFIjAl2KuxV2KuxV2KuxV2KuxV5v5w0LVrT8wW84pbT3emJ5euNNMVin
rXYuhMZY1SHhJX1PUorcSoI+OgpXIxyHDw9eJrkN78kX+Wumaw+s+ZfNepaY+ir5hktDaaZNw9dY
raAj1puBIV5WlPJCAykb45pChEG+FYDcnvZ7mO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuJAFT0xV5j58/Pryv5Zup9NtUbU9WhJR4YiPTRxx+3J0H7QIHxAj7NDXMrDpZT36NU8oD
zi6/5yR843N6k1rYQWtqtK2vL1OVDU1dkruNtszo9nCmg6gsv8tf85H6ZdziHXtPbTuVAs0LerGK
KftE8SOTUA2oOpbKcvZsgNt2cdSDzexW11b3VvHcW0qzQSqHilQhlZTuCCOoOa4iubkqmBXYq7FX
Yq7FXYq7FXYqwDzz+dXk/wApy/VZJDqGoUVvqlqVdgrgkFmrxX9k/ERUGormRi00ptcsgDzof85Q
aw5Xh5eh4j7ZNw9WHagCfD+OZo7Nvq0nU+TJfK3/ADkXoV/MINdtH0qR2/dzKfVgApQBn2ate/ED
7t68vZ047jdlHUA83rdtcwXMEdxbyLLBKoeORTUMrCoI+jNeRTkKmBXYq7FXYq7FXYq7FWHz/wB9
J/rH9ebAcmgrMKHYqn3l7/eaT/X/AIDMXPzbYck1yhm7FXYq7FXj3/OQv5mXflvSYtE0icR6pqis
ssqULwwinJga1RjWg271B2zL0uHiNlqyzp4J5D8ja95t1T6lpcXqSAc7i4kJEUSk/akeh6nt1Oba
WSOONycQRMjQe1Wf/OM5W3/0nXgtwR0ituSKfm0ilvuGY38q1yj9rZ+V82Geevyk17ypD9blZL7T
CQpvIQRwJ2AlQ1417GpHvXM7Ta2GXblJoy4TDfonH5IfmBc6PrUXlu/n/wBxF8zfVjIdoZiCeKkk
cVkP/DfMnMXtHSgjjHNt0+Xei+jc0bnOxV2KuxV2KuxV2KvLvz7/ADIl8peXY7LT246xq3JLd96R
xr/eSdKGlQAK9TuCKjMnTYuI+TVlnQeH/lv+U2uee7W91K2v4I3gm43BujIXd5BzL8lV6171zZT1
EcVAhx44zNllj/zj55wfVriyaW3itbbgDqDF/TkLIGpEvHk3HlQnYV75Z/KWMRB3vuY/lpEteavy
L8z6JpsmoRSQ6lbQKXuBByWRFG5bgw+JQOtDX2yzD2jjyHhOxYz08oi0R+SX5g3Wja1F5cvpS2k6
g/G1Lkn0Zz0Vd9lkO1Kfa+ZOUdo6UEcY5s9Pl3ovo7NG5zsVdirsVdirsVdirD5/76T/AFj+vNgO
TQVmFDsVT7y9/vNJ/r/wGYufm2w5MO178x9W0/zF5isYWshJodm9xp3l+RHOpauy2JuvUs29aOka
Sfu2CwSH4G6GmUM3n/mD86fN955Av3e503SHurLVzba7FJGyyva2kLRWtr9Sv7sW9873LlOU7ECL
lwqxVFUlv/M3nma91i2tNfuYJ5Lj6rcAz3Usscc2u2VpD61us0P1A+jcMLd4GVriLk5KvRgq9W8g
ah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fmpXd5+ampxXD
8/qIjtoTSlI+PqqtB4erTNtpQBEOJlO73z/nHbSbWz/LW0vYlHr6nNPNO/c+nK0CivgBF+OYmtkT
krubcA9LEfzU/NPzVov5jGy065MNhpXoc7QAcJzJGsz+ptU1WTj7UqN8ztJpITxWRuWjNmkJ7dHu
Gpafa6rpdzYXK87a8iaKRSP2XWlaHuM1MJmMgRzDmEWKfFjXs1hdw3kLcbi0lSaJga0eNgykEe4z
qswBjTqobF9r2DyPY27yNzkaJC7kAFmKipoKDf2zkzzdqFfAl2KuxV2KuxV2KvkH/nInWF1D8y54
0DJHZQpb8TQVdGYO+xPXYV8AM2uljUXEymy9R/5xZ/5R3Wf+YqP/AJN5X2hzHuZ6fkU5/OT80tc8
pahp+n6RFD6k8ZuZ5p1LgrzKKigFafZPI/KmOi0kcgJkjPmMTQZ75S15PMPlnT9Y9MR/XYQ8kXUK
4qrqK9QGBpmHmx8EzHub4S4hb5T/ADAtk0LzrqkNgfSFletJa8duFG9RAP8AV2zo8cuPECeoddIV
M0+vLB+djbvUnlEjVapbdQd6985g83ZBXwJdirsVdirsVdirD5/76T/WP682A5NBWYUOxVPvL3+8
0n+v/AZi5+bbDkmuUM3Yq7FXYq+T/wDnJnyydM88RavClLbVIQ0jcuR9dCQ1evEMKcfkadM2eknc
a7nGyjdn3/ONP5gabPoP+ErydYdQtJHk09HNPWhlJdlSvV0csSPA+xyrWYjfEGWGW1Mx83fk1onm
XzXBr9xcyQ09MX1oqKyz+lsvxE/DVQFOx2HbBh10scOEBZ4BKVpr+ZPnrTvKPly4uZZlGpTRsmnW
1RzeUigbj14ITVj9HUjKtNgOSVdOrPJPhD5S8q6VN5h81abpMUfrCedTMlVFYlPKQVYhalRQVO5o
M3mpy1ElwccLL7VtoFt7eKBSzLEiorMasQopUnxznCbdkqYFdirsVdirsVdir5Z/5yj8vz2nnCz1
tUAtb+3ERK1P72Ekkt2BYNsPYnNlpJemnGzDdmn/ADinJz8ua37Xcf8AybyGuNkMsA2LN/zJ/Kiy
87XFldNfNYXNopiZxGJQ8RPLjQslCDWhr36ZDS6w4gRV2nLh42SWkGjeU/LEULzC20vSbcK08p6K
g3Zj3Zj4dSdsx5GWSd9S2ACI9z5I1C4ufPHn91t0fnrN8xVEBZ0hZiSaLyJ9OIVNB2zfSkMeOu4O
ABxSfZVrE0NtDCzBmjRUZgKAlRSoG9M54uxVMCuxV2KuxV2KuxV8e63/AM5B+fLXWb+2jjsfTguZ
Y0rC5PFHKiv7z2zcRxCg4plugv8AoYz8wP8Afdh/yJf/AKqYfCCOIu/6GM/MD/fdh/yJf/qpj4QX
iL3v/nHrzzrXnDyzqV9qywrNb3voRiBCi8fSRtwWberZgauNSDdiNh6pmK2uxV2KuxVjnn7yPpnn
Py7No1/VAx9S3mABaOVQQrivhXt8ulRlmPIYGwxlGw+PPN3kDzd5Kv6ahbSpArVt9QjDek1GIU8x
9lqqdvpFRvm1x5RLk4koEIi0/Nz8w7e2FtH5hvhEBQBpmZgB2DNVh9+S8PH/ADQvFLvQFmvmvzbq
3pWqXWsanMQHdmaV9zxBkkc/CKnqxplhyxgO4MREkvp78l/ykTydZHU9RYS69eJSUgUWKM7+mtQG
/wBb9W22q1OoMzXRysePhen5itrsVdirsVdirsVdirHPP3kjTfOfl2bRr4lAx9SCYAFo5VB4uKjt
Xt8ulRlmPIYG2Mo2GF/kF5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26nIJUQwxxpjP/OQ
H5gea/KfnPTf0HqMlmJtPDSxgK8bETSCpjkDoT70y/SQjKJ4he7DLIg7PIdX8+fmB53uI7G7vLnV
JCax2cKBUqP2vShVE2H7RG2ZkRDHuBTSTKXN73+Sn5Nz+WOWteYI431mZAIodnFupo1FIPHlX7Rp
1Hw7Cra/U6nj2HJyMeOub2DMNudirsVdirsVdirsVfnj5l/5SPVf+Yy4/wCTrZvIcg4Z5pbkkOxV
9V/84jf8oVrP/bSP/JiPNbrfqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9dXedVVDYtCJUaIrsoW4
VuZcfLMNtYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWstwl2PShcr25MrHiFV11+
cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufzetLe90HSpG0Y6trUX1su
usINPW2af0Ymgu5IEkuZJt/TjSDchgSAAxVeiYqpz21vcJ6c8Sypv8LqGG4Knr7EjEFWNH8q/wAt
yat5a09m7s1ujEnxJIqT88s8afex4B3J1pOgaLo9utvpdlDZwrXikSBQOVKgeA26ZGUieaQAEfkU
uxV2KuxV2KuxV2KuxV2KrXiRxRhvQjkCQwB60YUI+jFWMeaPy08oeaNQtL7WbT6zPZjgnI1DJy5c
H5VPGtelOpy2GWURQYygCmeieUfLGhBho+mW9gH48vQjCVKggHbvv16nISmTzKREBNsil2KuxV2K
uxV2KuxV2Kvzx8y/8pHqv/MZcf8AJ1s3kOQcM80tySHYq+q/+cRv+UK1n/tpH/kxHmt1v1D3ORh5
PXdW8p6Rq2s2eqX6GdrO0vbAWjhHt5YNR9H11mjZW57WygCtKE1B7YbaxW4/JDyolxJLotxceXY5
b+PU5LXSodOjt2nggjggDQzWk6MkJiaWNSKCV3f7XHiqm8vkBpdWn1h/MGpnVTDJa2F5Sw5WUE80
c8scC/VODBzAi/v1kIXpSpxVKJvyS8sSWjWqX1/DFdW8lprPBreuoQzXUt5IlxygbhynuZWrb+kR
yoKACir0LFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Rta/wCc
afzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxzjKC/wChX/zV/wCWez/6SV/ph/NwR4Rd/wBC
v/mr/wAs9n/0kr/TH83BfCL3b8gPy+8x+SPLeo6frqRJcXN568QhkEg4ekibke6nMPU5BMghtxxI
D1DMdsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs
VdirsVdirsVdiqGOpWIJBmUEbEYOINnhS7nfpOw/3+uPEF8KXc79J2H+/wBceIL4Uu5VhuIZlLRO
HANCR44gsZRI5qmFi7FXYq7FVO4uIbaB553EcMYLO56ADElXj/mv/nIzSrK+ks/L1oNV9MsjXRYp
ATQbo1KtRq9BQihDZh5NWI8t2mWYBiUH5+/mCzDnHZtEOoERDkf63Lj/AMLmKdfJq/MFnvlP8+NJ
1K5W01u2/Rc0jBYpg3OCpIFGc0K9SakUpmTi1sZGjs2Qzg83qasrKGU1U7gjM1vbxV2KuxV2KuxV
2KuxV2KuxVDahqmnadbtcX9zHbQIpZpJGCgKCATv4VGAkDmgljx/NP8ALsS+l+n7QtUCoeq7/wCU
Bx/HK/Hh3sfEj3p7pet6RqsIm028hu4jUB4XDg8aA0p4VGTjIHkyBBRuSS7FXYq7FXYq7FXYqxCb
++k/1j+vKC7SPJZil2Kp95f/AN5pP9f+AyyDh6nmE0ybjOxV2KuxV86/85E/mHcz6n/g/T5THbwg
NqbKWBdmoViIIX/WPWopQ9a4Opy9A0ZZdGDeQvIet+aLs22mQgrHQ3FzIeMUQPTk1D1psAK5gxxS
yGg44iZHZ6/af848KsI+s63SUjdY7eqg/NpKn7hmQOze+X2Nv5bzec+cfLMWga9c6N9ZF21sE5TB
PTqZEDgceT9mHfNfnx+HPhu3GyR4TT0T8j/PF08x8rahNzSJC+nO53CggGLkSNl/ZFD9AGbLQ5yf
SXKwZL2L2bNk5LsVdirsVdirsVdirsVYf+Z35hWHkvQHu3ZZNQmPp2VoGHN3YH4qUaiim7Hb5mim
rLk4QwnKg+ZpdQ82/mB5iiW7mN3fXktLa1DCOFCRQBFYhVoq0qdzTcnNXOcpyrq4spGRZtqH5Iax
onlu71nU7q3Q2qK4tYuUjHkyrRmIRR9rtXHJpJxiZErLEQLLEtMutR0m6S90u5e1uUIYPGdjxPIB
lPwsKitCMw4ZpRNhpjMh9Dflh+Y0Xmqye3vSkOs21BNCDT1AannGD1XbxqO/Ynd6bUDIPNzsWTiD
Osym12KuxV2KuxV2KsQm/vpP9Y/rygu0jyWYpdiqfeX/APeaT/X/AIDLIOHqeYea+bfJvnPWPzE1
680wB4v0dplnbtfP9UhFpPJdHUIrK9jtLqaKZhFGrcD9mSrbiLjNxkt8k6j+Zun+VLfT57W/sdW0
vy7bJ5a0OOzaSwu5ItKBBv7uS05QXC3ClTA00VGAX468iqivJHmL8z7rVrOHzRc6jb6axVtPmtNM
mZrmcyASW2pyTaVbm3jQUpKkEKlW/vGKk4qyD8n9Y/MjUk1N/OimKVRAUtZIJoWguCZPXjjdrKyh
khFE4enJPTesrchRV8yecLmafzzrkkztI4vrhObks3GOQotSdzRVGajLzLhzfVP5LaRa6f8Al5pj
wqPVvVa6uJAN2d2IFf8AVQBcz9LECA83IxCosA/Mv81fNlp5qu9L0m5+oWlgwi+BEZ5GoCzMzq3c
7AZg6nVTEyAaAaMuU3Qeb3+sX+q6jPqF/L615cENNLQLyIAHRQANh2Ga/JIyNnm40jZsorynqs2m
+cdJvYKGWKbZT0IZSpB+g5dpTUgWeI0X1rnQOxdirsVdirsVdirsVdir5L/P3zBc6p+ZFzYu1bbS
VW3hRWZl5Mod2ofssahWp/Lmt1Mrk42U7su/5x20Xy/d319e6giNqFi9s2mM0jIwZxLz4oGUP9le
oOR0cYmRJ5jkjCATu941uw0rUNLuLPVlVtPmAFwruY1oGBFXUqRuB3zY5IiQqXJyZAEbvnL8yNN0
LSfNclloiomniGJlVJGmXkwPL42Zz+OaLV44xnUeTr80QDslvkvWp9F85aXewtxDzpbzAsUVo5mC
HkR+yCQ30Y6SZjMLhlUn1bnQOxdirsVdirsVdirEJv76T/WP68oLtI8lmKXYqn3l/wD3mk/1/wCA
yyDh6nmE0ybjOxV2KuxV8afnB5cm8vfmDqMbBjBdyG7gkYglhL8TluOwPOpp4U2GazNCpFxZii9x
/wCcfvPmnan5Yh8uzzKmq6byWKJjRpYCxdWSvXhXiQOgAzI0uQVw9Q24pbUyPzd+UflnzLqR1KZ5
7S9kAE727Lxk4igLK6t8VABUYc2kjM3yKzwiRt4N+YWiWnljzXe6Ras7W1uIjC8pBcrJEr1YgKOr
Htmpz4eCZAcTJCpUi/yZ0WfXfP1rMIxJZ6WDc3RYEpuCqKSAdyTUV60zJ0eK5X3NmGO76lzbuY7F
XYq7FXYq7FXYq7FXxt+c1tJafmlrnOvGaZZo2IIqrop2r4NUfRmszj1Fxcg3TX8oJlbzxoi13+sr
/wAROY2EfvQ1wHqD6I/NdWb8vdZCgk+khoPASoTm01f92XKy/SXy8hCmpzQF16vo4a88yaVax15S
3cC1ALUHqAs1B/KN8vwR9QZ4xu+xs6B2LsVdirsVdirsVfB3mHz152j1/U44/MOppGl3OqIt5cAA
CRgAAH6DMUl6GEBQ2S//AB956/6mPVP+k24/5rwWy4B3O/x956/6mPVP+k24/wCa8bXgHc+mf+cW
tZ1jVfKGrTapfXF/MmoFEkuZXmZV9CM8QXLECpy/FydVrwBIe57RljguxV2KuxVhP5qflpY+eNFE
LMYdStAz2FwADRj1U1ps1PH9QpVlxcQYTjb5S1/yt5q8o6i0OpW0ls8LgR3SV9NmoGUpIO/EhqGj
DuBmunjIO7jmNI+D81fPsUaxr5gv+KigBuJDt8ya4OOfeUcR71fQfL/nrz7qfK1S4vXkYLcandM7
RoNh8czciaV6Cp9sY4pTKiBL6k/L38v9K8maKlja/vrt/ivL1gA8khpX/VXbZf1nfNnixCApyoxo
Mpyxk7FXYq7FXYq7FXYq7FXiv/ORH5bXOtWcXmXS0aXULJBFcW6hmaSGpPw7kVQ9FoK1PViBmLqM
d7hqyR6vAPKvmObQ9csNUjXm1jPHP6Z2DCNgxUn/ACgKZgDYg9zRyNvrvSvzT/LnWdNWca3ZQxzL
SW1vZY4JFqN0eOUrWnQ0qPfNoM0CObkiYL55/N3W9Dm87Xj6JLBLp4jhWJ7Xj6NViUMF4fDsfDNX
qIgzNcnFyAGWzNP+cf8AyDdXF+PN2pI0UUIppkTBlL81IM1QV2psOtQTUUKk5Wkw16i24odX0Bme
5DsVdirsVdirsVfnl5l/5SPVf+Yy4/5OtmIXo4fSEtxZOxV9V/8AOI//AChWs/8AbSP/ACYjy7Fy
dT2h9Q9zJvOHnTW/K/mu/vtUk1BdBis5pNEs7ZdPeyvLi00+a8nhnbhJqEcnGIslCqfD13obXASN
PPXnMeVZJ7jUryz8zWV/oU+qWlza6d6Bs9YvI7YRWht2uaQODJQySNMOO/GoxVO187+ZdT/Nafy1
EbzSNLk07UoLEzaZP8V5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WI
tNnuYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWNndoUuoEmQqUIdQ3wtTkN/GmAi1pjw/L
H8vg3IeX7ISf79EQElfHmPir71yHhR7mPAGSQ28EC8IY1iTb4UUKNhQbD2GWUyX4q7FXYq7FXYq7
FXYq7FXYq06JIjI6h0cFWVhUEHYgg4q8x8+fkF5U8zXM2o2rNpmpzVZ5IQPSdzTd0pT+Ykjck9co
yacS3a5YwWAn/nFXWhLRPMNuYf5zA4an+ryI/wCGyn8oe9h4TL/J3/OOPlnSLiO81m4bWLmJuSxu
oW3qCCpMZrXoQQxI3yyGmA5so4gHrkUUUSBIkCIKkKooKk1PTxJzJbV2KuxV2KuxV2KuxV+eXmX/
AJSPVf8AmMuP+TrZiF6OH0hLcWTsVfVf/OI//KFaz/20j/yYjy7FydT2h9Q9z2MeWvLg1eXWhpVm
NYuE9KfUhbxfWZI+IXg83H1GXioFCemWuApWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS
6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q
Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq+edT/5xI+u6ld3v+K/T+tTSTen+j+XH1GLUr9ZFaV8Mq8J2Me0KFcP2/sQ
3/Qnn/f3f9y7/s6weF5p/lH+j9v7Hf8AQnn/AH93/cu/7OsfC81/lH+j9v7Hqv5R/lh/yrzRbzTP
0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnE1GfxDdUzrJNDsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeE+eYtP1
78wPNVj5l1N/q2iWtnJ5d0WS7SxgmaWAPNKrOOLOjsd+prStBthZRxEg9OQaJiyWafkX5g1zXfIi
XWrtJM8VzLBaXc3IyTwIFIdnYn1CHZ05D+Wh3By3TSkYbs8RJG70LMhsdirsVdirsVdirsVdirsV
dirGPO3nyw8rCwt2tZ9R1fV5Gg0nTrYDlLKoH2nYhUQM6hm3IrWhocryZOH3ljKVLPJn5gWXmSe7
06a1k0rXtONL7SrgqzqK05xuu0kdduQA7dipMceYS25EIjO/eyrLmbsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVS3VfLHlrV5Ul1bSbLUZY14RyXdvFOyrWtFMisQK5EwB5hBAR1vb29tbx
W1tEkNvCixwwxqEREQUVVUUAAAoAMkAlUxV2KuxV2KuxV2KuxV2KuxV2KsB/NHyPruvXnl3XNBli
GqeW7prqO0uHaNJ0Yo7R+ooajMYFXfajGpGU5YE0R0YTiTuFD8vPIGq6f5p1jzlrf+i6jq6mOHSU
nN0tvFIUkkEk5Veb84wFC/Cq92r8McWKpGR5lEIUbei5kNjsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVf//Z</xapGImg:image> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:height>208</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynbe
YJ5YPIt1eTJ5h9NiqPIsYezSUp+84F0cmm21eoXMnT8jX1dGrJ0vkgvyquNDj/MTVdO8mS8/KaaZ
FPqUNu8k1lHqzShR6Mko5fFCrbj7VP8AJFJ5yTAGX1X9jHH9W3J7FmG3uxV2KuxV2KuxV2KuxV2K
pD5s89eU/KUNvN5h1FLFbpylupWSV3KirFY4ld+K7ValBUeIycMcpcgxlIDmivLfmfQfMumDU9Dv
FvbIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlE0UxkDuE0yCXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FVO5tre6t5ba5iSe3mUxzQyKHR0YUZWVqggjqDhBpVPT9N07TbRLLTrWGys4q+nb
W8axRLyJZuKIFUVJJOJJO5QBSIwJdirsVdirsVdirsVdirsVeb+cdC1a0/MF/OMdvNdaYnl24030
7FPXuxdCYyxqkPCSvqep8LcSoIPOgpXIxyHDw9eJrkDd+SL/AC10zWH1nzL5r1LTH0VfMMlobTTJ
uHrrFbQEetNwJ4vK0p5IQGUjfHNIUI3dLAbk97Pcx2x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxVxIAqemKvMfPn59+V/LN1Pptqjanq0JKPDER6aOOP25Og/aBA+IEfZoa5lYdLKe/Rq
nlAeb3X/ADkl5xub1JrWwgtbVaVteQk5UNTV2Su422zOj2cKcc6ksw8s/wDOSGmXc4h1/T207lQL
NC3qxiin7RPEjk1ANqDqWynL2dIDbdsjqQeb2K2ura6t47i2lWaCVQ8UqEMrKdwQR1BzXEU5KpgV
2KuxV2KuxV2KuxV2KsA88/nX5P8AKcv1WSQ6hqFFb6palXYK4JBZq8V/ZPxEVBqK5kYtNKbXPKA8
5H/OUOsOV4eXoOIPxk3D1YdqAJ8P45mjs2+rQdV5Mm8rf85GaDfzCDXrR9Kd2/dzKfVgApQBn2at
e/ED7t6svZ847jdlDUg83rdtcwXMEdxbyLLBKoeORTUMrCoI+jMAinJVMCuxV2KuxV2KuxV2KsOn
/vpP9Y/rzYDk45WYVdiqf+Xv95ZP9f8AgMxc/NthyTXKGbsVdirsVePf85C/mZd+W9Ii0TSJxHqm
qKyyypQyQwinJga1RmrQbd6g7ZlabDxGy05Z0HgfkPyNr3m3VPqWlxepIBzuLiQkRRKT9qR6Hqe3
U5tpZI443JxBEyNB7VZ/84ykW/8ApOvhbgjpFbckU/NpFLfcMx/5VrlH7W38p5sM89/lHr/lOH63
KyX2lkhTeQgjgTsBKhrxr2NSPeuZ2m1sMu3KTRlwyhv0Tj8j/wAwbnR9ai8tX8/+4i+ZvqxkO0Mx
BPFSSOKyH/hvmTmL2jpQRxjm26bLvRfR2aNznYq7FXYq7FXYq7FXlv5+fmRL5S8uR2Wntx1jVuSW
770jjX+8k6UNKgAV6ncEVGZOmxcR8mrLOg8P/Lf8ptc892t7qVtfwRvBNxuGujIXd5BzL8lV6171
zZT1EcVAhxo4zNlll/zj35wk1a4smlt4rS24A6gxf05CyB6RLx5tx5UJ2Fe+T/lHGIg733Mfy0iV
vmr8ivM+h6bJqEUkOpW0Cl7hYOSyIo6twYfEoHWhr7ZZh7QxzPCdixnp5RF80T+SP5hXWja1F5bv
pS+k6g/G1Lkn0Zz0Vd9lkO1Kfa+ZOU9oaUEcY5s9Pl3ovo/NG57sVdirsVdirsVdirDp/wC+k/1j
+vNgOTjlZhV2Kp/5e/3lk/1/4DMXPzbYcmHa9+Y+raf5i8xWMLWQk0Oze407y/IjnUtXZbE3XqWb
etHSNJP3bBYJD8DdDTKGbz/zB+dHnC88gag73GnaQ91Zav8AVteikjZZXtbSF4rW1+pX92Le+d7m
QpynYgRcuFSVRVJL7zN56mv9Zt7XX7mGeS5+qzAz3UskcU2t2NnCJrZZoRYH0p2Fu8BDXEXJyyvR
gq9X8gah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fupXd5+
ampxXD8/qIjtoTSlI+PqqtB4erT8c22lAEQ4eU7vfP8AnHbSbWz/AC0tL2JR6+pzTzTv3PpytAor
4ARfjmJrZE5K7m7APSxD81fzU81aL+YxstOuTDYaV6HO0AHCcyRrM/qbVNVk4+1KjfM3SaSE8Vkb
lozZpCe3R7jqen2uq6Xc2FyvO2vImikUj9l1pWh7jNTCRjIEcw5khYp8VNezWF3DeQtxuLSVJomB
rR42DKQR7jOqzAGNOphsX2zYPI9jbvI3ORokLuQAWYqKmgoN/bOUPN2wV8CXYq7FXYq7FXYq+QP+
citYXUfzMnjQMkdlClvxNBV0Zg77E9dhXwAza6WNRcTKbL1H/nFn/lHdZ/5io/8Ak3lXaHMe5lp+
RTn85PzT1zyjqGn6fpEUPqTxm5nmnUuCvMoqKAVp9k8j8qYdFpI5ATJc+YxIAZ75R19PMXlnT9Y9
MR/XYQ8kXUK4qrqK9QGBpmHmx8EzHuboS4gC+U/zAtk0LztqkNgfSFletJa8duFG9RAP9XbOixy4
8QJ6h10hwzNPr2wfnY271J5RI1WqW3UHevfOZPN2YV8CXYq7FXYq7FXYqw6f++k/1j+vNgOTjlZh
V2Kp/wCXv95ZP9f+AzFz822HJNcoZuxV2KuxV8n/APOTXlk6Z54i1eFKW2qQhpG5cj66Ehq9eIYU
4/I06ZstLO413OLmjuz3/nGj8wdNn0H/AAjeTrDqFpI8mno5p60MpLsqV6ujliR4H2OV6zEb4gyw
y2pmXm78mtD8y+a4NfuLmSGnpi+tFRWWf0tl+In4aqAp2Ow7YMOtljhwgJngEpWmv5lee9O8o+XL
i5lmUalNGyabbVHN5SKBuPXghNWP0dSMq02A5JV06s8uThD5Q8q6VN5h81abpMUfrCedTMlVFYkP
KQVYhalRQVO5oM3mpy1ElwMULL7XtoFt7eKBSzLEiorMasQopUnxznCbdmqYFdirsVdirsVdir5Z
/wCcpPL89p5ws9bVALW/txEStT+9hJJLdgWDbD2JzY6SXppxsw3Zp/zinJz8ua37Xcf/ACbyGuNk
JwDYs2/Mn8p7LztcWV0181hdWimJnEYlDxE8uNCyUINaGvfpkdLqziBFXbLLh42S2kGjeUvLEULz
C30vSbcK88p/ZQbs3+Ux8O52zHkZZJ31LYAIjyD5H1C4ufPHn+RbdH56zfMyogLOkLMSTReRPpxC
poO2b6Uhjx13B14HFJ9l2sTQ20MLMGaNFRmAoCVFKgb0zni7JUwK7FXYq7FXYq7FXx5rf/OQfny1
1m/to47H04LmaNKwuTxRyor+89s28cYoOIZG0H/0MZ+YH++7D/kS/wD1UyXhBHEXf9DGfmB/vuw/
5Ev/ANVMfCC8Re9/849eeda84eWdSvtWWFZre99CMQIUXj6SNuCzb1bMDVxqQb8RsPVMxW12KuxV
2Ksc8/8AkfTPOfl2bRr+qBj6lvMAC0cqghXFfCvb5dKjLMeQxNhjKNh8d+b/ACB5u8lX9NQtpUgV
62+oRhvSajEKeY+y1VO30io3zaY8olycSUCERafm7+YdvbC2j8w3wiAoA0zMwA7Bmqw+/J+Hj7gj
il3oCzXzX5u1b0rVLrWNTmIDuzNK+54gySOfhFT1Y0yZyxiO4MREkvp78l/ykTydZHU9RYS69eJS
UgUWKM7+mtQG/wBb9W22r1GoMzXRy8ePheoZitrsVdirsVdirsVdirHPP3kjTfOflybRr8lAx9SC
YAFo5VB4uKjtXt8ulRlmPIYm2Mo2GFfkD5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26jI
JUQwxRItjP8AzkB+YHmvyn5z039BajJZibTw0sYCyRsRNIKmOQOhPvTL9JCMoniF7sM0iDs8h1fz
5+YPne4jsbu8udUkJrHZQoFSo/a9KFUTYftEbZmREMe4FNBMpc3vn5J/k3P5Y5a15gjjfWZkAih2
cW6mjUUg8eVR8Rp1Hw7Cra/U6nj2HJycWKub2DMNudirsVdirsVdirsVfnh5m/5SPVf+Yy4/5Otm
7jyDhHmluSQ7FX1Z/wA4jf8AKFaz/wBtI/8AJiPNdrPqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9
dXedVVDYtCJUaIrsoW4VuZcfLMNuYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWst
wl2PShcr25MrHiFV11+cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufze
tLe80HSpH0Y6vrUX1ssNYQaets05hiaC7kgR7mSanwRpBuQwqAORVeiYqpz21vcJ6c8Sypv8LqGG
4Knr7EjEFWMn8q/y3Jq3lrT2buzW6MSfEkipPzyzxp97HgHcnekaBouj262+l2UNnCteKRIFA5Uq
B4DbpkZSJ5pAAR+RS7FXYq7FXYq7FXYq7FXYqteJHFGG9COQJDAHrRhQj6MVYx5o/LPyh5o1C0vt
ZtPrM9mOCcjUMnLlwflU8a16U6nLIZZRFBjKAKZ6J5R8saEGGj6Zb2Afjy9CMJUqCAdu+/XqcjKZ
PMpEQE2yKXYq7FXYq7FXYq7FXYq/PDzN/wApHqv/ADGXH/J1s3ceQcI80tySHYq+rP8AnEb/AJQr
Wf8AtpH/AJMR5rtZ9Q9zkYeT13VvKekatrNnql+hnaztL2wFo4R7eWDUfR9dZo2Vue1soArShNQe
2G3MVuPyQ8qJcSS6LcXHl2OW/j1OS10qHTo7dp4II4IA0M1pOjJCYmljUigld3+1x4qpvL5AaXVp
9YfzBqZ1UwyWtheUsOVlBPNHPLHAv1TgwcwIv79ZCF6UqcVSib8kvLElo1ql9fwxXVvJaazwa3rq
EM11LeSJccoG4cp7mVq2/pEcqCgAoq9CxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KvkXWv+cafzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxjiKC/6Ff8AzW/5
Z7P/AKSV/ph/NwR4Rd/0K/8Amt/yz2f/AEkr/TH83BfCL3f8gPy+8x+SPLWo6frqRJcXN59YiEMg
kHD0kTcj3U5h6nIJmw3Y4kDd6hmO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2
KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDHUrEEgzKCNiMHEGzwpdzv0nYf7/XHiC+DLud+k
7D/f648QXwZdyrDcQzKWicOAaEjxxBYyiRzVMLF2KuxV2KqdxcQ20DzzuI4YwWdz0AGKCaeQeav+
cjdJsbyWz8v2Y1Vo2Km7LlIDt1U0JajV6bEbhsBLg5tfGPLdiMH5+fmCzDlHZmIdQIiHI/1uXH/h
cjxOCe1JBn3lP8+NJ1K5W01u2/Rc0jBY5g3OCpIFGc049SakUphEnLwdpQmaOz1JWVlDKaqdwRkn
ZN4q7FXYq7FXYq7FXYq7FXYqhr/UtP0+3a4vriO2hQFmeRgoABAJ3+YwgWgyA5pEfzN8gCX0/wBO
2paoFVeq7/5QHH8cn4Uu5q/MY+8J1pus6TqcQm067iuojUB4nDA8aA9PCoyBiRzbIzEuRRmBk7FX
Yq7FXYq7FXYqxCf++k/1j+vKC7WPJZiydiqfeX/95pP9f+AyyHJwdV9QTTJuM7FXYq7FXzr/AM5E
/mHcz6n/AIP0+Qx28IDamylgXZqFYiCF/wBY9ailD1rEl1utzfwhg/kLyHrfmi7NtpkIKR0NxcyE
rFED05MAetNgBXBTq4YZ5ZVF69af848IsI+s63SWm6x2/wAIPzaSp+4YeFyx2P3y+x5z5x8sxaBr
1zo31kXbWwTlME9PeRA4HHk/Zh3yJdTqcPhZDG7p6J+R/ni6eZvK2oTc0iQvp0jncKCAYuRI2X9k
UP0AZKJdz2ZqjIcBezZJ3DsVdirsVdirsVdirsVYl+ZPn6x8naE125WS/mPp2dqGHN2IPxUo3wim
5O3zNFNmOHEWnNlEA+c3vfNXnzzBH9clN1e3clLe2DCOFCRQBFY8VoopU7mm5OZ8YCIt0+TJLJKu
pZte/k1qmj+X7nVtRuYENsqt9Wi5SMeTBaMxCgfa7VxhqIykAAjLopxgZSPJjOny3+mXK3mmXD21
whBDodjxNQGU/CwqOhGZMsYkN3Bx55QNgvdfy58/p5ltHt7wpDq9vT1YgacwannGD22+Y79idVnw
8B8nodJqhlHmzTKHMdirsVdirsVdirEJ/wC+k/1j+vKC7WPJZiydiqfeX/8AeaT/AF/4DLIcnB1X
1B5r5t8m+c9Y/MTXrzTAHi/R2mWdu18/1SEWk8l0dQisr2O0upopmEUatwP2ZKtuIuM3GS3yTqP5
m6f5Ut9Pntb+x1bS/LtsnlrQ47NpLC7ki0oEG/u5LTlBcLcKVMDTRUYBfjryKqL8k+Y/zPutXtIf
NFzqNtprFW0+a00ydjczmQB7XU5JtKt2t40FKSpBEpVv7xipOKp/+T+sfmRqSam/nRTFKogKWskE
0LQXBMnrxxu1lZQyQiicPTknpvWVuQoq+ZfOFxNP551ySZ2kcX1wnNyWbjHIUWpO5oqjIF0OfmX1
R+S+kWun/l5pjwqPVvVa6uJAN2d2IFf9VAFyQdnooCOMebAPzL/NXzZaearvS9JufqFpYMIvgRGe
RqAszM6t3OwGRJdbrNdkGQxiaAeb3+sX+q6jPqF/L613cENNLQLyIAHRQANh2GB1OWZmeI8yivKe
qy6b5x0m9gAMsU2ynoQylSD9BxDkaGRjkBfWuWPVuxV2KuxV2KuxV2KuxV8rfnpr1xqn5i3Fk7Vt
9KVbeFFYsvJlDu1D0Y1CtT+XM3BGg6nVzuXuZf8AkDo2h3N3eXl8im+s2t205mkZCGcS8+KhlD/Z
HUHJamRAAHJjoYxlIk8xVfa9u1ix02+02e01MK1jKAJwzmMUDAirKVI3A75hQkQbHN2uSMZRIlye
CefbHRdM8zPZ6OqrYiKNlCSNKOTA8viZnP45ttPOUo+rm83rcUIzqHJLfKurzaR5t0y8hbiHmSCY
FiqmOVgp5EdgSG+jHURuJXRZDHIH0zmnendirsVdirsVdirEJ/76T/WP68oLtY8lmLJ2Kp95f/3m
k/1/4DLIcnB1X1BNMm4zsVdirsVfGv5weXJvL35g6jGwYwXchu4JGIJYS/E5bjsDzqaeFNhkC6bU
46kXuH/OP3nzTtT8sQ+XZ5lTVdN5LFExo0sBYurJXrwrxIHQAZIOXosoMeE8wyPzd+UflnzLqR1K
d57S9cATvbsvGTiKAsrq3xUAFRiQuo0EMsuI2C8G/MLQ7Tyx5rvdItWdra3ERheUguVeJXqxAUdS
e2QIdHqtPwZDEckX+TOiz675+tZxGJLPSwbi5LAlNwVRSQDuSaivWmEOX2fhud9z6lybv3Yq7FXY
q7FXYq7FXYq+QvzgtpLT8zta514yzLKjEUqrop2r4Go+jM7EfSHUakesp1+U06v5w0da7+uD/wAK
cvyH92XEwD99H3vfPzNUnyJq4AqfTQ7eAlUnMDT/AFh3Gt/upPnBCFNTm4eZKppxa78waZaxk8pb
qFagFqD1BVqDwG+U5pekuTpoXMe99ZZp3p3Yq7FXYq7FXYq+DfMPnrztHr+pxx+YdTSNLudURby4
AAEjAAAP0GYpL0cIDhGyX/4+89f9THqn/Sbcf814LZcA7nf4+89f9THqn/Sbcf8ANeNrwDufTP8A
zizrOsar5Q1abVL64v5k1Aokl1K8zKvoRniC5YgVOXYuTqe0ABIe57TlrgOxV2KuxVhP5p/lrY+d
9FELMYdStAz2FwADRj1U1ps1PEfgKAhpz4RMeb5S1/yt5q8o6iYdStpLZ4XAjukr6bNQMpSQd+JD
UNGHcDIuoyYjE7o+D81fPsUaxrr9/wAVFBWeQ7fMknFHiZP5xV9B8v8Anrz7qfK2S4vXkYLcandM
7RoNh8czciaV6Cp9saWGCWQ976k/L3yBpXkzRUsbX99dv8V5esAHkkNK+PFdtl/Wd8kA7jDhEBQZ
ThbnYq7FXYq7FXYq7FXYq8b/AOcgfy6uNYtIvMemI0t/ZKIp7dQzNJDUn4dyKoei0FanqxAy/DOt
nD1WK9w8J8q+ZJtE1qx1JBzaznjm9M7BgjAlfpG2ZZ3FOtG0ge59X6X+Z35favp6zjWbOFJVpJbX
kscEi1G6skpWvhtUZgnHIHk7iOeEhzDwb81td0WXzhdto8sEtgEhWN7biYqiNQ3Hh8PXwzPwyIju
6fVQichMeTLfyI8j3dzfjzXqKNFDCKabGwYFy4IMtRx2psOtQTUUKk4+oy3s5ei09eovd8xHZuxV
2KuxV2KuxV+ePmX/AJSPVf8AmMuP+TrZiHm9LD6QluBk7FX1X/ziN/yhWs/9tI/8mI8vxcnUdo/W
Pcyfzh501vyv5rv77VJNQXQYrOaTRLO2XT3sry4tNPmvJ4Z24SahHJxiLJQqnw9d6G116Rr5685D
ytLPPqV5Z+ZbK/0KfVLO5tdO9A2esXkdsIrQ27XIELgyUMkjTDjvxqMVTtfO/mXU/wA1p/LURvNI
0uTTtSgsTNpk/wAV5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WItNn
uYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWVndoUuoEmQqUIdQ3wtTkN/GmKCAWPD8sfy+
Dcx5fshJ/v0RASV8eY+KvvXGmvwYdzJIbeCBeEMaxJt8KKFGwoNh7DFtpfirsVdirsVdirsVdirs
VdirTojoyOoZGBVlYVBB2IIOKvNfPH5E+V/MlzNqFsW03Upas8kIHpu5pu6Up4kkbknrlsMxDjZN
NGW/Vgp/5xf1kS0TX4DD/OYHDU/1eRH/AA2W/mPJo/JHvZZ5R/5x58uaTPHd6vcNq1zE1VjdQtvU
EFSY969CCGJG+QlnJ5NuPSRHPd6vHFHEgSNQiCpCqKCpNT08TlDl0uxV2KuxV2KuxV2Kvzx8y/8A
KR6r/wAxlx/ydbMQ83pYfSEtwMnYq+q/+cRv+UK1n/tpH/kxHl+Lk6jtH6x7nsg8teXBq8utDSrM
axcJ6U+pC3i+syR8QvB5uPqMvFQKE9MtdepWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS
6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q
Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq+eNT/5xH+vald3v+K/T+tTSTen+j+XH1GLUr9ZFaV8MqOLzdlHtGhXD9v7
EN/0J3/393/cu/7OsHhebL+Uv6P2/sd/0J3/AN/d/wBy7/s6x8LzX+Uv6P2/serflH+V/wDyrzRb
zTP0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnD1GfxDdUzrJOO7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXhPnm
HT9e/MDzVY+ZdTf6toltZyeXtEku0sYJmlg5TSBnHFnR2O/U1pWg2iXXZwJSkD05C6Zp+RfmDXNd
8iJdau0kzxXMsFpdzcjJPAgUh2difUIdnTkP5aHcHCG7RzlKHqehYXLdirsVdirsVdirsVdirsVd
irHfOHnax8tCxga2mv8AVNVkaDTNPtwOUsigfadiFRAzKGbcitaHfLMePi8gGjNnEKFWTyW+U/O1
pr011YTW0mm61Yn/AEzTZypdRWnONl2kSu3Knh4issuEwo84nqw0+qGQmPKQ5hkmUuU7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUt1Xyx5a1eVJdW0my1CWNeEcl3bxTsq1rRTIrECuLGU
InmEdb29vbW8VtbRJDbwoscMMahEREFFVVFAAAKADFIFKmKXYq7FXYq7FXYq7FXYq7FXYqwf8yfJ
uta3d6DrOiSxDUvL1y1zHbTs0aTIxR2TmoahJhC77UJqcvw5AAQeri6nDKRjKPOKn5F8k6rZeZNV
82ayfq99qi+nDpaTG5W3ico7iSYqvNuaAKF+FR3NdpZs1xERyDDTabhmch2MunNnmYzmuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q==</xmpGImg:image> </rdf:li> </rdf:Alt> - </xap:Thumbnails> + </xmp:Thumbnails> </rdf:Description> <rdf:Description rdf:about="" - xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"> - <xapMM:DocumentID>uuid:89B13A64E5D9DE11BB37992E5642CB24</xapMM:DocumentID> - <xapMM:InstanceID>uuid:bce40ba9-528e-1a48-b1a0-2636e427f460</xapMM:InstanceID> - <xapMM:DerivedFrom rdf:parseType="Resource"> + <xmpMM:DocumentID>uuid:89B13A64E5D9DE11BB37992E5642CB24</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:c9fc39ea-7338-234e-90fd-9c707322e008</xmpMM:InstanceID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"> <stRef:instanceID>uuid:1052650b-0efc-4cb2-a32e-387095575b05</stRef:instanceID> <stRef:documentID>uuid:6120892493BFDB11914A8590D31508C8</stRef:documentID> - </xapMM:DerivedFrom> + </xmpMM:DerivedFrom> </rdf:Description> <rdf:Description rdf:about="" xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> @@ -46,517 +47,517 @@ <illustrator:StartupProfile>Print</illustrator:StartupProfile> </rdf:Description> <rdf:Description rdf:about="" - xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#" - xmlns:xapG="http://ns.adobe.com/xap/1.0/g/"> - <xapTPg:NPages>1</xapTPg:NPages> - <xapTPg:HasVisibleTransparency>False</xapTPg:HasVisibleTransparency> - <xapTPg:HasVisibleOverprint>False</xapTPg:HasVisibleOverprint> - <xapTPg:MaxPageSize rdf:parseType="Resource"> - <stDim:w>841.889771</stDim:w> - <stDim:h>595.275574</stDim:h> + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>841.889648</stDim:w> + <stDim:h>595.275391</stDim:h> <stDim:unit>Pixels</stDim:unit> - </xapTPg:MaxPageSize> - <xapTPg:Fonts> + </xmpTPg:MaxPageSize> + <xmpTPg:Fonts> <rdf:Bag> <rdf:li rdf:parseType="Resource"> <stFnt:fontName>MyriadPro-Regular</stFnt:fontName> <stFnt:fontFamily>Myriad Pro</stFnt:fontFamily> <stFnt:fontFace>Regular</stFnt:fontFace> <stFnt:fontType>Open Type</stFnt:fontType> - <stFnt:versionString>Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032</stFnt:versionString> + <stFnt:versionString>Version 2.062;PS 2.000;hotconv 1.0.57;makeotf.lib2.0.21895</stFnt:versionString> <stFnt:composite>False</stFnt:composite> <stFnt:fontFileName>MyriadPro-Regular.otf</stFnt:fontFileName> </rdf:li> </rdf:Bag> - </xapTPg:Fonts> - <xapTPg:PlateNames> + </xmpTPg:Fonts> + <xmpTPg:PlateNames> <rdf:Seq> <rdf:li>Cyan</rdf:li> <rdf:li>Magenta</rdf:li> <rdf:li>Yellow</rdf:li> <rdf:li>Black</rdf:li> </rdf:Seq> - </xapTPg:PlateNames> - <xapTPg:SwatchGroups> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:groupName>Default Swatch Group</xapG:groupName> - <xapG:groupType>0</xapG:groupType> - <xapG:Colorants> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + <xmpG:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>White</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>255</xapG:red> - <xapG:green>255</xapG:green> - <xapG:blue>255</xapG:blue> + <xmpG:swatchName>White</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>Black</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>35</xapG:red> - <xapG:green>31</xapG:green> - <xapG:blue>32</xapG:blue> + <xmpG:swatchName>Black</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>35</xmpG:red> + <xmpG:green>31</xmpG:green> + <xmpG:blue>32</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Red</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>236</xapG:red> - <xapG:green>28</xapG:green> - <xapG:blue>36</xapG:blue> + <xmpG:swatchName>CMYK Red</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>236</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>36</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Yellow</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>255</xapG:red> - <xapG:green>241</xapG:green> - <xapG:blue>0</xapG:blue> + <xmpG:swatchName>CMYK Yellow</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>241</xmpG:green> + <xmpG:blue>0</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Green</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>165</xapG:green> - <xapG:blue>81</xapG:blue> + <xmpG:swatchName>CMYK Green</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>165</xmpG:green> + <xmpG:blue>81</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Cyan</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>173</xapG:green> - <xapG:blue>238</xapG:blue> + <xmpG:swatchName>CMYK Cyan</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>173</xmpG:green> + <xmpG:blue>238</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Blue</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>46</xapG:red> - <xapG:green>49</xapG:green> - <xapG:blue>145</xapG:blue> + <xmpG:swatchName>CMYK Blue</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>49</xmpG:green> + <xmpG:blue>145</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>CMYK Magenta</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>235</xapG:red> - <xapG:green>0</xapG:green> - <xapG:blue>139</xapG:blue> + <xmpG:swatchName>CMYK Magenta</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>235</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>139</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=16 M=98 Y=92 K=7</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>194</xapG:red> - <xapG:green>39</xapG:green> - <xapG:blue>45</xapG:blue> + <xmpG:swatchName>C=16 M=98 Y=92 K=7</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>194</xmpG:red> + <xmpG:green>39</xmpG:green> + <xmpG:blue>45</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=99 Y=97 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>236</xapG:red> - <xapG:green>32</xapG:green> - <xapG:blue>39</xapG:blue> + <xmpG:swatchName>C=0 M=99 Y=97 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>236</xmpG:red> + <xmpG:green>32</xmpG:green> + <xmpG:blue>39</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=79 Y=96 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>240</xapG:red> - <xapG:green>92</xapG:green> - <xapG:blue>39</xapG:blue> + <xmpG:swatchName>C=0 M=79 Y=96 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>240</xmpG:red> + <xmpG:green>92</xmpG:green> + <xmpG:blue>39</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=50 Y=98 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>246</xapG:red> - <xapG:green>146</xapG:green> - <xapG:blue>33</xapG:blue> + <xmpG:swatchName>C=0 M=50 Y=98 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>246</xmpG:red> + <xmpG:green>146</xmpG:green> + <xmpG:blue>33</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=35 Y=87 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>250</xapG:red> - <xapG:green>175</xapG:green> - <xapG:blue>59</xapG:blue> + <xmpG:swatchName>C=0 M=35 Y=87 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>250</xmpG:red> + <xmpG:green>175</xmpG:green> + <xmpG:blue>59</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=5 M=0 Y=93 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>249</xapG:red> - <xapG:green>236</xapG:green> - <xapG:blue>35</xapG:blue> + <xmpG:swatchName>C=5 M=0 Y=93 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>249</xmpG:red> + <xmpG:green>236</xmpG:green> + <xmpG:blue>35</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=19 M=0 Y=98 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>216</xapG:red> - <xapG:green>223</xapG:green> - <xapG:blue>39</xapG:blue> + <xmpG:swatchName>C=19 M=0 Y=98 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>216</xmpG:red> + <xmpG:green>223</xmpG:green> + <xmpG:blue>39</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=50 M=0 Y=99 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>139</xapG:red> - <xapG:green>197</xapG:green> - <xapG:blue>64</xapG:blue> + <xmpG:swatchName>C=50 M=0 Y=99 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>139</xmpG:red> + <xmpG:green>197</xmpG:green> + <xmpG:blue>64</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=74 M=0 Y=99 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>61</xapG:red> - <xapG:green>180</xapG:green> - <xapG:blue>74</xapG:blue> + <xmpG:swatchName>C=74 M=0 Y=99 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>61</xmpG:red> + <xmpG:green>180</xmpG:green> + <xmpG:blue>74</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=86 M=12 Y=100 K=9</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>146</xapG:green> - <xapG:blue>69</xapG:blue> + <xmpG:swatchName>C=86 M=12 Y=100 K=9</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>146</xmpG:green> + <xmpG:blue>69</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=88 M=28 Y=95 K=32</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>104</xapG:green> - <xapG:blue>55</xapG:blue> + <xmpG:swatchName>C=88 M=28 Y=95 K=32</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>104</xmpG:green> + <xmpG:blue>55</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=76 M=0 Y=75 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>34</xapG:red> - <xapG:green>180</xapG:green> - <xapG:blue>115</xapG:blue> + <xmpG:swatchName>C=76 M=0 Y=75 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>34</xmpG:red> + <xmpG:green>180</xmpG:green> + <xmpG:blue>115</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=78 M=9 Y=46 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>3</xapG:red> - <xapG:green>168</xapG:green> - <xapG:blue>156</xapG:blue> + <xmpG:swatchName>C=78 M=9 Y=46 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>3</xmpG:red> + <xmpG:green>168</xmpG:green> + <xmpG:blue>156</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=70 M=15 Y=0 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>37</xapG:red> - <xapG:green>169</xapG:green> - <xapG:blue>224</xapG:blue> + <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>37</xmpG:red> + <xmpG:green>169</xmpG:green> + <xmpG:blue>224</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=87 M=52 Y=0 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>16</xapG:red> - <xapG:green>114</xapG:green> - <xapG:blue>185</xapG:blue> + <xmpG:swatchName>C=87 M=52 Y=0 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>16</xmpG:red> + <xmpG:green>114</xmpG:green> + <xmpG:blue>185</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=99 M=96 Y=4 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>46</xapG:red> - <xapG:green>55</xapG:green> - <xapG:blue>143</xapG:blue> + <xmpG:swatchName>C=99 M=96 Y=4 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>55</xmpG:green> + <xmpG:blue>143</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=100 M=100 Y=26 K=25</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>38</xapG:red> - <xapG:green>34</xapG:green> - <xapG:blue>97</xapG:blue> + <xmpG:swatchName>C=100 M=100 Y=26 K=25</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>38</xmpG:red> + <xmpG:green>34</xmpG:green> + <xmpG:blue>97</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=74 M=98 Y=1 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>103</xapG:red> - <xapG:green>48</xapG:green> - <xapG:blue>144</xapG:blue> + <xmpG:swatchName>C=74 M=98 Y=1 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>103</xmpG:red> + <xmpG:green>48</xmpG:green> + <xmpG:blue>144</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=49 M=99 Y=1 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>146</xapG:red> - <xapG:green>41</xapG:green> - <xapG:blue>141</xapG:blue> + <xmpG:swatchName>C=49 M=99 Y=1 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>146</xmpG:red> + <xmpG:green>41</xmpG:green> + <xmpG:blue>141</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=34 M=100 Y=37 K=11</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>157</xapG:red> - <xapG:green>30</xapG:green> - <xapG:blue>96</xapG:blue> + <xmpG:swatchName>C=34 M=100 Y=37 K=11</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>157</xmpG:red> + <xmpG:green>30</xmpG:green> + <xmpG:blue>96</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=12 M=100 Y=49 K=1</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>211</xapG:red> - <xapG:green>28</xapG:green> - <xapG:blue>92</xapG:blue> + <xmpG:swatchName>C=12 M=100 Y=49 K=1</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>211</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>92</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=0 M=96 Y=20 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>236</xapG:red> - <xapG:green>37</xapG:green> - <xapG:blue>122</xapG:blue> + <xmpG:swatchName>C=0 M=96 Y=20 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>236</xmpG:red> + <xmpG:green>37</xmpG:green> + <xmpG:blue>122</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=23 M=27 Y=40 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>198</xapG:red> - <xapG:green>178</xapG:green> - <xapG:blue>152</xapG:blue> + <xmpG:swatchName>C=23 M=27 Y=40 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>198</xmpG:red> + <xmpG:green>178</xmpG:green> + <xmpG:blue>152</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=40 M=43 Y=52 K=7</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>152</xapG:red> - <xapG:green>133</xapG:green> - <xapG:blue>118</xapG:blue> + <xmpG:swatchName>C=40 M=43 Y=52 K=7</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>152</xmpG:red> + <xmpG:green>133</xmpG:green> + <xmpG:blue>118</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=50 M=53 Y=61 K=23</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>117</xapG:red> - <xapG:green>101</xapG:green> - <xapG:blue>88</xapG:blue> + <xmpG:swatchName>C=50 M=53 Y=61 K=23</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>117</xmpG:red> + <xmpG:green>101</xmpG:green> + <xmpG:blue>88</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=57 M=60 Y=64 K=42</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>85</xapG:red> - <xapG:green>72</xapG:green> - <xapG:blue>65</xapG:blue> + <xmpG:swatchName>C=57 M=60 Y=64 K=42</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>85</xmpG:red> + <xmpG:green>72</xmpG:green> + <xmpG:blue>65</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=23 M=38 Y=63 K=1</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>197</xapG:red> - <xapG:green>156</xapG:green> - <xapG:blue>110</xapG:blue> + <xmpG:swatchName>C=23 M=38 Y=63 K=1</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>197</xmpG:red> + <xmpG:green>156</xmpG:green> + <xmpG:blue>110</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=32 M=49 Y=74 K=10</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>165</xapG:red> - <xapG:green>124</xapG:green> - <xapG:blue>82</xapG:blue> + <xmpG:swatchName>C=32 M=49 Y=74 K=10</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>165</xmpG:red> + <xmpG:green>124</xmpG:green> + <xmpG:blue>82</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=36 M=57 Y=84 K=23</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>139</xapG:red> - <xapG:green>99</xapG:green> - <xapG:blue>57</xapG:blue> + <xmpG:swatchName>C=36 M=57 Y=84 K=23</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>139</xmpG:red> + <xmpG:green>99</xmpG:green> + <xmpG:blue>57</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=39 M=64 Y=93 K=36</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>117</xapG:red> - <xapG:green>77</xapG:green> - <xapG:blue>36</xapG:blue> + <xmpG:swatchName>C=39 M=64 Y=93 K=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>117</xmpG:red> + <xmpG:green>77</xmpG:green> + <xmpG:blue>36</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=41 M=70 Y=96 K=49</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>97</xapG:red> - <xapG:green>57</xapG:green> - <xapG:blue>23</xapG:blue> + <xmpG:swatchName>C=41 M=70 Y=96 K=49</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>97</xmpG:red> + <xmpG:green>57</xmpG:green> + <xmpG:blue>23</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=47 M=73 Y=83 K=68</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>65</xapG:red> - <xapG:green>35</xapG:green> - <xapG:blue>18</xapG:blue> + <xmpG:swatchName>C=47 M=73 Y=83 K=68</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>65</xmpG:red> + <xmpG:green>35</xmpG:green> + <xmpG:blue>18</xmpG:blue> </rdf:li> </rdf:Seq> - </xapG:Colorants> + </xmpG:Colorants> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:groupName>Print Color Group</xapG:groupName> - <xapG:groupType>1</xapG:groupType> - <xapG:Colorants> + <xmpG:groupName>Print Color Group</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=2 M=28 Y=72 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>246</xapG:red> - <xapG:green>187</xapG:green> - <xapG:blue>96</xapG:blue> + <xmpG:swatchName>C=2 M=28 Y=72 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>246</xmpG:red> + <xmpG:green>187</xmpG:green> + <xmpG:blue>96</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=5 M=70 Y=90 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>231</xapG:red> - <xapG:green>110</xapG:green> - <xapG:blue>52</xapG:blue> + <xmpG:swatchName>C=5 M=70 Y=90 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>231</xmpG:red> + <xmpG:green>110</xmpG:green> + <xmpG:blue>52</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=4 M=92 Y=77 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>229</xapG:red> - <xapG:green>59</xapG:green> - <xapG:blue>65</xapG:blue> + <xmpG:swatchName>C=4 M=92 Y=77 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>229</xmpG:red> + <xmpG:green>59</xmpG:green> + <xmpG:blue>65</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=29 M=2 Y=92 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>191</xapG:red> - <xapG:green>210</xapG:green> - <xapG:blue>65</xapG:blue> + <xmpG:swatchName>C=29 M=2 Y=92 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>191</xmpG:red> + <xmpG:green>210</xmpG:green> + <xmpG:blue>65</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=62 M=4 Y=93 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>109</xapG:red> - <xapG:green>182</xapG:green> - <xapG:blue>78</xapG:blue> + <xmpG:swatchName>C=62 M=4 Y=93 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>109</xmpG:red> + <xmpG:green>182</xmpG:green> + <xmpG:blue>78</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=30 M=2 Y=7 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>174</xapG:red> - <xapG:green>218</xapG:green> - <xapG:blue>230</xapG:blue> + <xmpG:swatchName>C=30 M=2 Y=7 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>174</xmpG:red> + <xmpG:green>218</xmpG:green> + <xmpG:blue>230</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=60 M=8 Y=5 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>85</xapG:red> - <xapG:green>185</xapG:green> - <xapG:blue>223</xapG:blue> + <xmpG:swatchName>C=60 M=8 Y=5 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>85</xmpG:red> + <xmpG:green>185</xmpG:green> + <xmpG:blue>223</xmpG:blue> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>C=78 M=4 Y=11 K=0</xapG:swatchName> - <xapG:mode>RGB</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:red>0</xapG:red> - <xapG:green>178</xapG:green> - <xapG:blue>215</xapG:blue> + <xmpG:swatchName>C=78 M=4 Y=11 K=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>178</xmpG:green> + <xmpG:blue>215</xmpG:blue> </rdf:li> </rdf:Seq> - </xapG:Colorants> + </xmpG:Colorants> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:groupName>Grayscale</xapG:groupName> - <xapG:groupType>1</xapG:groupType> - <xapG:Colorants> + <xmpG:groupName>Grayscale</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> <rdf:Seq> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=100</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>255</xapG:gray> + <xmpG:swatchName>K=100</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>255</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=90</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>229</xapG:gray> + <xmpG:swatchName>K=90</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>229</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=80</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>203</xapG:gray> + <xmpG:swatchName>K=80</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>203</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=70</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>178</xapG:gray> + <xmpG:swatchName>K=70</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>178</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=60</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>152</xapG:gray> + <xmpG:swatchName>K=60</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>152</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=50</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>127</xapG:gray> + <xmpG:swatchName>K=50</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>127</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=40</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>101</xapG:gray> + <xmpG:swatchName>K=40</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>101</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=30</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>76</xapG:gray> + <xmpG:swatchName>K=30</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>76</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=20</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>50</xapG:gray> + <xmpG:swatchName>K=20</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>50</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=10</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>25</xapG:gray> + <xmpG:swatchName>K=10</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>25</xmpG:gray> </rdf:li> <rdf:li rdf:parseType="Resource"> - <xapG:swatchName>K=5</xapG:swatchName> - <xapG:mode>GRAY</xapG:mode> - <xapG:type>PROCESS</xapG:type> - <xapG:gray>12</xapG:gray> + <xmpG:swatchName>K=5</xmpG:swatchName> + <xmpG:mode>GRAY</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:gray>12</xmpG:gray> </rdf:li> </rdf:Seq> - </xapG:Colorants> + </xmpG:Colorants> </rdf:li> </rdf:Seq> - </xapTPg:SwatchGroups> + </xmpTPg:SwatchGroups> </rdf:Description> </rdf:RDF> </x:xmpmeta> @@ -581,38 +582,26 @@ -<?xpacket end="w"?>
endstream
endobj
2 0 obj
<</Count 1/Type/Pages/Kids[5 0 R]>>
endobj
15 0 obj
<</Intent 16 0 R/Usage 17 0 R/Name(Class)/Type/OCG>>
endobj
27 0 obj
<</Intent 28 0 R/Usage 29 0 R/Name(Package)/Type/OCG>>
endobj
37 0 obj
<</Intent 38 0 R/Usage 39 0 R/Name(Object)/Type/OCG>>
endobj
65 0 obj
<</Intent 66 0 R/Usage 67 0 R/Name(Class)/Type/OCG>>
endobj
78 0 obj
<</Intent 79 0 R/Usage 80 0 R/Name(Package)/Type/OCG>>
endobj
90 0 obj
<</Intent 91 0 R/Usage 92 0 R/Name(Object)/Type/OCG>>
endobj
116 0 obj
<</Intent 117 0 R/Usage 118 0 R/Name(Class)/Type/OCG>>
endobj
129 0 obj
<</Intent 130 0 R/Usage 131 0 R/Name(Package)/Type/OCG>>
endobj
141 0 obj
<</Intent 142 0 R/Usage 143 0 R/Name(Object)/Type/OCG>>
endobj
167 0 obj
<</Intent 168 0 R/Usage 169 0 R/Name(Class)/Type/OCG>>
endobj
180 0 obj
<</Intent 181 0 R/Usage 182 0 R/Name(Package)/Type/OCG>>
endobj
192 0 obj
<</Intent 193 0 R/Usage 194 0 R/Name(Object)/Type/OCG>>
endobj
218 0 obj
<</Intent 219 0 R/Usage 220 0 R/Name(Class)/Type/OCG>>
endobj
237 0 obj
<</Intent 238 0 R/Usage 239 0 R/Name(Package)/Type/OCG>>
endobj
255 0 obj
<</Intent 256 0 R/Usage 257 0 R/Name(Object)/Type/OCG>>
endobj
287 0 obj
<</Intent 288 0 R/Usage 289 0 R/Name(Class)/Type/OCG>>
endobj
306 0 obj
<</Intent 307 0 R/Usage 308 0 R/Name(Package)/Type/OCG>>
endobj
324 0 obj
<</Intent 325 0 R/Usage 326 0 R/Name(Object)/Type/OCG>>
endobj
356 0 obj
<</Intent 357 0 R/Usage 358 0 R/Name(Class)/Type/OCG>>
endobj
375 0 obj
<</Intent 376 0 R/Usage 377 0 R/Name(Package)/Type/OCG>>
endobj
393 0 obj
<</Intent 394 0 R/Usage 395 0 R/Name(Object)/Type/OCG>>
endobj
425 0 obj
<</Intent 426 0 R/Usage 427 0 R/Name(Class)/Type/OCG>>
endobj
444 0 obj
<</Intent 445 0 R/Usage 446 0 R/Name(Trait)/Type/OCG>>
endobj
462 0 obj
<</Intent 463 0 R/Usage 464 0 R/Name(Package)/Type/OCG>>
endobj
480 0 obj
<</Intent 481 0 R/Usage 482 0 R/Name(Object)/Type/OCG>>
endobj
515 0 obj
<</Intent 516 0 R/Usage 517 0 R/Name(Class)/Type/OCG>>
endobj
534 0 obj
<</Intent 535 0 R/Usage 536 0 R/Name(Trait)/Type/OCG>>
endobj
552 0 obj
<</Intent 553 0 R/Usage 554 0 R/Name(Package)/Type/OCG>>
endobj
570 0 obj
<</Intent 571 0 R/Usage 572 0 R/Name(Object)/Type/OCG>>
endobj
605 0 obj
<</Intent 606 0 R/Usage 607 0 R/Name(Class)/Type/OCG>>
endobj
624 0 obj
<</Intent 625 0 R/Usage 626 0 R/Name(Trait)/Type/OCG>>
endobj
642 0 obj
<</Intent 643 0 R/Usage 644 0 R/Name(Package)/Type/OCG>>
endobj
660 0 obj
<</Intent 661 0 R/Usage 662 0 R/Name(Object)/Type/OCG>>
endobj
695 0 obj
<</Intent 696 0 R/Usage 697 0 R/Name(Base)/Type/OCG>>
endobj
699 0 obj
<</Intent 700 0 R/Usage 701 0 R/Name(Class)/Type/OCG>>
endobj
718 0 obj
<</Intent 719 0 R/Usage 720 0 R/Name(Trait)/Type/OCG>>
endobj
735 0 obj
<</Intent 736 0 R/Usage 737 0 R/Name(Package)/Type/OCG>>
endobj
753 0 obj
<</Intent 754 0 R/Usage 755 0 R/Name(Object)/Type/OCG>>
endobj
785 0 obj
<</Intent 786 0 R/Usage 787 0 R/Name(Base)/Type/OCG>>
endobj
789 0 obj
<</Intent 790 0 R/Usage 791 0 R/Name(Class)/Type/OCG>>
endobj
808 0 obj
<</Intent 809 0 R/Usage 810 0 R/Name(Trait)/Type/OCG>>
endobj
825 0 obj
<</Intent 826 0 R/Usage 827 0 R/Name(Package)/Type/OCG>>
endobj
843 0 obj
<</Intent 844 0 R/Usage 845 0 R/Name(Object)/Type/OCG>>
endobj
878 0 obj
<</Intent 879 0 R/Usage 880 0 R/Name(Base)/Type/OCG>>
endobj
882 0 obj
<</Intent 883 0 R/Usage 884 0 R/Name(Class)/Type/OCG>>
endobj
901 0 obj
<</Intent 902 0 R/Usage 903 0 R/Name(Trait)/Type/OCG>>
endobj
918 0 obj
<</Intent 919 0 R/Usage 920 0 R/Name(Package)/Type/OCG>>
endobj
936 0 obj
<</Intent 937 0 R/Usage 938 0 R/Name(Object)/Type/OCG>>
endobj
971 0 obj
<</Intent 972 0 R/Usage 973 0 R/Name(Base)/Type/OCG>>
endobj
975 0 obj
<</Intent 976 0 R/Usage 977 0 R/Name(Class)/Type/OCG>>
endobj
994 0 obj
<</Intent 995 0 R/Usage 996 0 R/Name(Trait)/Type/OCG>>
endobj
1011 0 obj
<</Intent 1012 0 R/Usage 1013 0 R/Name(Package)/Type/OCG>>
endobj
1029 0 obj
<</Intent 1030 0 R/Usage 1031 0 R/Name(Object)/Type/OCG>>
endobj
1030 0 obj
[/View/Design]
endobj
1031 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
1012 0 obj
[/View/Design]
endobj
1013 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
995 0 obj
[/View/Design]
endobj
996 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
976 0 obj
[/View/Design]
endobj
977 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
972 0 obj
[/View/Design]
endobj
973 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
937 0 obj
[/View/Design]
endobj
938 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
919 0 obj
[/View/Design]
endobj
920 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
902 0 obj
[/View/Design]
endobj
903 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
883 0 obj
[/View/Design]
endobj
884 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
879 0 obj
[/View/Design]
endobj
880 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
844 0 obj
[/View/Design]
endobj
845 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
826 0 obj
[/View/Design]
endobj
827 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
809 0 obj
[/View/Design]
endobj
810 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
790 0 obj
[/View/Design]
endobj
791 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
786 0 obj
[/View/Design]
endobj
787 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
754 0 obj
[/View/Design]
endobj
755 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
736 0 obj
[/View/Design]
endobj
737 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
719 0 obj
[/View/Design]
endobj
720 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
700 0 obj
[/View/Design]
endobj
701 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
696 0 obj
[/View/Design]
endobj
697 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
661 0 obj
[/View/Design]
endobj
662 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
643 0 obj
[/View/Design]
endobj
644 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
625 0 obj
[/View/Design]
endobj
626 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
606 0 obj
[/View/Design]
endobj
607 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
571 0 obj
[/View/Design]
endobj
572 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
553 0 obj
[/View/Design]
endobj
554 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
535 0 obj
[/View/Design]
endobj
536 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
516 0 obj
[/View/Design]
endobj
517 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
481 0 obj
[/View/Design]
endobj
482 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
463 0 obj
[/View/Design]
endobj
464 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
445 0 obj
[/View/Design]
endobj
446 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
426 0 obj
[/View/Design]
endobj
427 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
394 0 obj
[/View/Design]
endobj
395 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
376 0 obj
[/View/Design]
endobj
377 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
357 0 obj
[/View/Design]
endobj
358 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
325 0 obj
[/View/Design]
endobj
326 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
307 0 obj
[/View/Design]
endobj
308 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
288 0 obj
[/View/Design]
endobj
289 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
256 0 obj
[/View/Design]
endobj
257 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
238 0 obj
[/View/Design]
endobj
239 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
219 0 obj
[/View/Design]
endobj
220 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
193 0 obj
[/View/Design]
endobj
194 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
181 0 obj
[/View/Design]
endobj
182 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
168 0 obj
[/View/Design]
endobj
169 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
142 0 obj
[/View/Design]
endobj
143 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
130 0 obj
[/View/Design]
endobj
131 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
117 0 obj
[/View/Design]
endobj
118 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
91 0 obj
[/View/Design]
endobj
92 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
79 0 obj
[/View/Design]
endobj
80 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
66 0 obj
[/View/Design]
endobj
67 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
38 0 obj
[/View/Design]
endobj
39 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
28 0 obj
[/View/Design]
endobj
29 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
16 0 obj
[/View/Design]
endobj
17 0 obj
<</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>>
endobj
970 0 obj
[1029 0 R 1011 0 R 994 0 R 975 0 R 971 0 R]
endobj
5 0 obj
<</CropBox[321.5 204.775 334.5 217.775]/Parent 2 0 R/Contents 1048 0 R/BleedBox[0.0 0.0 841.89 595.276]/PieceInfo<</Illustrator 962 0 R>>/ArtBox[321.5 204.775 334.5 217.775]/MediaBox[0.0 0.0 841.89 595.276]/Thumb 1053 0 R/TrimBox[0.0 0.0 841.89 595.276]/Resources<</XObject<</Fm0 986 0 R/Fm1 993 0 R/Fm2 1003 0 R/Fm3 1010 0 R/Fm4 1020 0 R/Fm5 1028 0 R/Fm6 1038 0 R/Fm7 1045 0 R>>/ColorSpace<</CS0 982 0 R>>/Font<</T1_0 1046 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 971 0 R/MC1 975 0 R/MC2 994 0 R/MC3 1011 0 R/MC4 1029 0 R>>/ExtGState<</GS0 978 0 R>>>>/Type/Page/LastModified(D:20100413200510+02'00')>>
endobj
1048 0 obj
<</Length 1948/Filter/FlateDecode>>stream
-H‰ÌWËŽ5Ý÷Wx™,®Çå··L -ZÖíÿu¹ÄÐgIIy_±ã<¾+i,¼}pë:§Œ¿.ï öP—ÎØ5•æmØW±!¥´«{[°£ -ûYì$ÖC«je¹g±-´uÊG+ÒL„S×±[SãÒAðÞ¡°j}l6 -w" )lÞ |IsZ±ƒ¢66]#Ì -Piæñ6y†ÉK°
†Ý¢±ß -rHv”ËÆÐÄF’5nZ¦1’¤”u\•î˜ÄI&b,p]4MV˜˜˜cœuÔ“ ãP´ÞÀÀœF%÷Ì :HÜÁÙQë‰4¨ò> ÷G!æišeH„¾¶éZ
`Ãcõ -H¶CŸá’:P«Ûz쎾þ˜²må9cÄfwó§s@Èð~¾0‡æð_f²p.….7–ªdCõ¨¯¥^"'€ýù@Ó"¤2’L¯ü\BaËPp¯p]zòÐ&à‘¿—µLX‘¢EpÒïdüã„Àsômš»¥ì“¢Åxf†Íœ+ˆìÚ‹C?œÖ ŸU\ó†J³ôµŠ×scàÐ}„»½ÖÕGäl–²EÔ\8ÂKGì.%C´:¨wHº'¥øœ7Ê
”ŠL'é%Jq¸z”k¦dÇ5m^4ÄÅsª_›025úèL¹íÇtˤðEi}†‚oH+%Ç#·×@ïŠÆ•>".wbì˜w]NÈ`ͨiçÁ9ıgEÊÈ„C€f¼CΔÛNAÙ@ (K£Z Ú1‘šÚµcêq¤ð,°çG†3*ðÉWµGá -6&-Ñ£´Y픪ç6¨¬ÌœJCÆL™ì»”t¤ ÀRõÒ±ú…7QX¥Î”î)çȸÀÓ¡nÒ¡Áb”‘{;¦Œ#å¦6‹qâÁ©Ä'Ý¥ÑBÖfž2N”ÛN¬$Ý3¢1•ô´›¾.g -õ€´¼¯‘ÊÆ«ÛcöËUóñùË; ñÇRùÜ£`|²Âü‹»îx¼éÂKsuÄuϦ½pDýÔ)>l”›R„
gmÚ‰’‚vÒ·3…}({j\"ŠW O(ŽMä™r›((sMÆƱÅg)a´#¤°×:RJ¥8¶¶¼ÄÈ•Í-uÁ=¬ì˜º)”vkâ@Ñr}Wv¾;Fš—¬Ž”ÛD‰‰YºÉ"›ov\,w-f -eÀ!L<8“ØUoÎλvkºŠ]GîLxg‘‚bgv&›R;à2$ìx¶xÆ…˜N”Tg l3ûÝ#|XʪÕD^kE½ï‡V%ÅIe@ÛT7|]Δ›ÚKšŸx OòºKËGìò0ðD¸M\[±)‡ðz®Ðy¶Û¿ãër¦ô“´™ïÍ•¨î?;äŸj"Ëi.ªÞGMr¿qÑ)ióµþÓö_'X(ü¶L|¯øJ_¦LãGA,)}Á^ç¾+¾´ïʽ²|ºBz${E» ×íóO‚ø¢ -ÿ« -ù¬oH*UzE';«‹øhÐñ3žgÑn/µëRôÝ×ÜÀå pÄMùe#fP'Q¬ -8Éͯvù:¢—ÚÐÒó¹Ë&?`óø&Cw`„×}ëa¾Ù´i7¼6|F£†9¾5i#…
g¦ºx;.¾s7íÀM;ª(Ϥc*
Žr~g ê^±(
›xw‡‹ÃSß/ýi‚^Êo€æÉiškMŸ| uàtŽ´•DÓÌu»¤UŽÊ@Ž‹˜ÝÚ‘ï?P\æË¡#¾Wðj‚CÕ”s\Ñoè3«¡3¼¾ðW7¡Z³†¢ýEæðé|ý¸Êäm¶¢®Hg™UœRøÛå/ -8;Xnf&7>J<fDsP~>
endstream
endobj
978 0 obj
<</OPM 1/BM/Normal/CA 1.0/OP false/SMask/None/ca 1.0/AIS false/op false/Type/ExtGState/SA true>>
endobj
1046 0 obj
<</Subtype/Type1/FontDescriptor 1047 0 R/LastChar 102/Widths[513 513 0 513 513 513 0 513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 448 564 501 292]/BaseFont/XAMDXC+MyriadPro-Regular/FirstChar 49/Encoding/WinAnsiEncoding/Type/Font>>
endobj
1047 0 obj
<</StemV 88/FontName/XAMDXC+MyriadPro-Regular/FontStretch/Normal/FontFile3 1050 0 R/FontWeight 400/Flags 32/Descent -250/FontBBox[-157 -250 1126 952]/Ascent 952/FontFamily(Myriad Pro)/CapHeight 674/XHeight 484/Type/FontDescriptor/ItalicAngle 0>>
endobj
1050 0 obj
<</Subtype/Type1C/Length 1212/Filter/FlateDecode>>stream
-H‰|SmPg¾#\N„¦-ñMìÝY-àH‘BR? -((ØH%t´sÚ LÔŠšv¦-„X~P¨"ZGT§„ŠZÔ"ÅX$ÊHüK;ô{ñÍŒ½Øÿý³»Ïûì³ûî;ïâXh†ãø¬‚ô¼Ì‚Œy;M^e2¾ŸÏm)+Ñ™‚$ÃËq~f(?;‚B ÇË—/s ¨}¾}yvè¹H,ÇžÎ0– -Ú-Ÿ[ØÄ„„„¸ U°¯2]o,âXõN³…Ûffs¶o2šJ&…Ódzé%%l~Pffó93g*jâÕñ¬JHØna3JEœ2%1þ¿«±3«cM܃PÍÄéY‹I§ç¶éL[Yãfö:-\®þdg)Ǧ°zn3†áX$ŽQ!Ø,ËaáÂ#`yX)Ö…ùñ|¼/duˆ3ä•H-Ú7UÓÃOöà‚×#ª å«üª@•¨BË`ÏĈE½A žˆ7¼Ža°˜¿D#D’#åü€·¦"¬ãÒ3`÷Óibé0z÷£ÃÙ@Ü jÅ’ßàÁŸñ£<èb-y©›€w`æ£Iˆ=Sý‰Ø´UFn}<h;á>qM>yruc›Ÿ–ŒRQâòì™RèYÃp{?èÃ?/ -²ž'ð±q$ºH"ÖÀ”E"بZ’`GÓ‰CÇ›;g9ÄÕ›Á CÛH‰u:‡ ù~ŸˆÏòÓº)Ö¡ÂÑÚî<#‡¨«'ÛE¦&Eµ¶ùP)]–MTt\¯‘Ãœ©ç õê®´3›´.ܼ»ºº’iƒÅØÅëô
BÂ]ü§GÐ"”Vøc©]e¶ïv0‹¾Ê(Ö¬¶jÕúh4C†–>A0 ƒiêDfhE%t•øàÏÐ-mÎ{“mŠ§Ž¾¨f9ëöÓ?·ºOõÊÇzÕññ¹iŒÄz“ïê<óxå0?\é“z žRRßbCášE²8o*̆·&ï1ªý5õ$í ¥÷îw»vE6–;Š"‘X‘5–zÔêÛú)ê”)Ú¾AóÛùž»Gé Ón‰LêÉ)Ð.¡í¼@ßíЬSmܤþ‚Ik.<= WÏu{h‰Û:Âc¿ãÂØ1)«©xV¾ cB§®{AÔ}ʺ÷Ó<D4˜×7®“£Ä÷†æ£Øç1=ðËá†F‹¬#úr~Ù0lˆìôAû„ÔÍÇø)ÔUMž-ÓžN—£é1±HigPÌãX½vþò1ºV,t&£âªS6÷ï%“Nj·moÕ^ZêÎ٥ѫäqŸŽýõâòý'ƒÝëÕŒÃj¯´Ê$ÿX‡aI?ÌíÇ;‚k\ÄA9eÿ¾ö@“̧%¢9JD¢hí‹…ù÷zè +û‰ÝÅœ5Wžô‘«{?u£þ¬×'ÿ»U¡¶1VXå-HÁ½D°4ŠWBØ-ö#yç‡Á?Úš¾ý¦‘n"ê¿,/‘}¶gk1S¤¯Ì[!³¬È -(…ŸéòØ€6¸`¡Ëí -XêÅüÊ:”[0º.ֵבô‘Y_xvkúDø„3â
~ÿ~.õ¯ -H‰œ–yTSwÇoÉž•°Ãc
[€°5la‘QIBHØADED„ª•2ÖmtFOE.®cÖ}êÒõ0êè8´×Ž8GNg¦Óïï÷9÷wïïÝß½÷ó - -V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó -€x¯Íú·¶Ò- -¨ê‡†¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r9‹\A&‘GÈ”ˆrQ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½ÄÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél
»—½‡}Ž}ŸCâ¸qâ9 -N'çÎ)Î].ÂuæJ¸rî -î÷wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â*6X[ݱF=3ë·YŸ±~dó ·‘ÛtÛ´¹iÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö -n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜IJlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§§|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßYÕ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø
Ú†žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝèþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMÅ›Î
nßLÝlÜ<9”úO -¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ
æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ -/CS0 cs 0.29 0.486 0.133 scn -1 i +<?xpacket end="w"?>
endstream
endobj
2 0 obj
<</Count 1/Kids[5 0 R]/Type/Pages>>
endobj
5 0 obj
<</ArtBox[154.5 205.274 523.59 501.023]/BleedBox[0.0 0.0 841.89 595.275]/Contents 1315 0 R/CropBox[0.0 0.0 841.89 595.275]/LastModified(D:20110404194430+02'00')/MediaBox[0.0 0.0 841.89 595.275]/Parent 2 0 R/PieceInfo<</Illustrator 1316 0 R>>/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/Font<</T1_0 1307 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 1308 0 R/MC1 1309 0 R/MC2 1310 0 R/MC3 1311 0 R/MC4 1312 0 R/MC5 1313 0 R>>/XObject<</Fm0 1319 0 R/Fm1 1320 0 R/Fm2 1321 0 R/Fm3 1322 0 R/Fm4 1323 0 R/Fm5 1324 0 R/Fm6 1325 0 R/Fm7 1326 0 R>>>>/Thumb 1327 0 R/TrimBox[0.0 0.0 841.89 595.275]/Type/Page>>
endobj
1315 0 obj
<</Filter/FlateDecode/Length 1961>>stream
+H‰ÌWÉŽ7½çWð(ŠÍ}¹ºå10€f ¨9†e·
£ÚÆŒþ˜÷"˜™ÌTÙ²Œ–*ù‚Œ`06þýhÞ>:óÕ›G³|ý?JòJzx|ïÌõ£q¶çŠßæÚø5¯¿,ß`úÇKªÎfº·S—ØlŒÑŒÏÿ~Xž‡!¸ÚƯŒ9ÚPóo0Ž=SZLŒ)T[“Q÷ò)Ý}bŒÛ”Â]Ưžgø§G|òß9ãÍÓóâ“ñIMvO»'óô²|xu}]^ýð}{N¯¿}ú'$\0›yz³¼ò)ä\^?ýLr±½ ùëç$Lòó)W.>ùD®¯Ÿ¾ ê›ÿbyîY,×’·›ËŠqÿ˜_dÉËÃ?^œyóëòNÝùøÇáŸyÿø¯%™·$G3Áã/’ÌõE,Áß‹Ï6•„o°9èÙ¶ÿ×咢Β’˾cÇy|WÒX:x•}pë:'Œ?-ï¡öP—îØ5õ=Øäqèм9ç]Ý‹·;1h°ŸÅNÞhÕ¬CîYm} +ÉzßM‚[×±¶åÎ¥ƒ‚žÂš
°Û*Š8€¦°eƒð&ÍiÆŠÚÔegÐ#„j77ˆ·9vL^¢í0„— û
@6gÃ6õÐ%ÇBŽÓ¥‚äˆñnk0‰ +]Ûe±a²±’E¤Cßa(pKÉ(•n=ö…ÉGJY¶òœ1âH*ºúóE:"lxÙÞ/Òñ‹Štü«Šô¡HÄs‘ˆ,~¥³|e[jG½-í…Tóþ ²@iB„×QAÂÉ-_*A¬ì*®ò®‹‚úrù²–ŒÒµŠÎëÌ€Ÿœ'ÜE_äqû¤—^ƒb3ÄÎUDxÓÂàР+TÃ>adm‰ôÓ™rÛ)Ž©WHáíŠR{‡‚oÌ+¥¤#·×@•~"®}bìXv]NÈ`ýhyçÁ9¼c«ŠôñŽšñN9Sn;
f%¢D)Få@åc2u±«bêq¤ð,°çÇ;Tà“ÿ®bÊlXz¦Gi³¦”&ç6Œ¨²Ì¼ÊCÆL™ì»Ô|¤ ÈRù^±ø…·R\¥Îõ”sŒd]äéPCé‡Øa1ÊÈÈ¿SÆ‘r›¥4ñàT>dÙ¥ÓB–6Ÿ2N”ÛN¬ìÕ3^b*Ëi7/|]Îêix_"•
™ÚcöËUròþEž=ÃQc©þ=n‡çQ0>[eþÀ½÷7<ÞË/ÏU- +ÚÌÐÏö§ìµq¡®\F= wl.Ï”ÛDA¹ë~lœzºK‰£E!…ýבR³ŠcËËÝØôRÜÉr@ÅÔåH¡´`Š—Ó]Ùïé^‹H8Rne +8;Z]!0oj-o&4Mq#BXZ(r-qRjZg"d;e'fX2?:$%:pb1G;i=ZP,(M5$Ct>Pr+OM%Sb3 +$Z$YM!!)e4pih!i-MB:^dR_nsi+[p*`^+#SD`bS0lt>(HO8LDNEmrh`0uV.i4u*`_ +<QuhYM+[,LK_;/1Bi3D]@_As80$4fVpZLHDB2T:(K_'G0h$g%6n.8p"/JA-b,c&qf +UbPa<\L=gX;:6"QDSB056Ip4P?@MB$feXFUaj4\dSiP/#U:<PVfi:Gt;qD1sE,nhI +B.M&9Cj3K\";_P6/u!Kf]tDfDELrplU'e?"h&JBb-edM:j$_i`M&(%OVm&WU5dR#= +[Sm2,zn4nE;!7($KU&~>
endstream
endobj
1328 0 obj
[/Indexed/DeviceRGB 255 1329 0 R]
endobj
1329 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
1319 0 obj
<</BBox[155.001 324.272 210.999 268.274]/Group 1330 0 R/Length 283/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1331 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.173 0.522 0.345 scn /GS0 gs q 1 0 0 1 183 308.2725 cm 0 0 m @@ -623,11 +612,11 @@ q 1 0 0 1 183 308.2725 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
993 0 obj
<</Subtype/Form/Length 244/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 988 0 R/Resources<</XObject<</Fm0 992 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
-/CS0 cs 0.29 0.486 0.133 scn -1 i +
endstream
endobj
1320 0 obj
<</BBox[180.624 223.274 192.621 211.277]/Group 1332 0 R/Length 296/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1333 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.173 0.522 0.345 scn /GS0 gs q 1 0 0 1 186.627 218.2744 cm 0 0 m @@ -638,11 +627,12 @@ q 1 0 0 1 186.627 218.2744 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1003 0 obj
<</Subtype/Form/Length 258/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 998 0 R/Resources<</XObject<</Fm0 1002 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
-/CS0 cs 0.29 0.486 0.133 scn -1 i +
endstream
endobj
1321 0 obj
<</BBox[306.003 319.277 362.001 263.279]/Group 1334 0 R/Length 287/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1335 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.243 0.533 0.643 scn /GS0 gs q 1 0 0 1 334.002 303.2773 cm 0 0 m @@ -653,11 +643,11 @@ q 1 0 0 1 334.002 303.2773 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1010 0 obj
<</Subtype/Form/Length 247/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1005 0 R/Resources<</XObject<</Fm0 1009 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
-/CS0 cs 0.29 0.486 0.133 scn -1 i +
endstream
endobj
1322 0 obj
<</BBox[321.996 217.271 334.002 205.274]/Group 1336 0 R/Length 298/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1337 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.212 0.624 0.78 scn /GS0 gs q 1 0 0 1 327.999 212.2715 cm 0 0 m @@ -668,11 +658,12 @@ q 1 0 0 1 327.999 212.2715 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1020 0 obj
<</Subtype/Form/Length 262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1015 0 R/Resources<</XObject<</Fm0 1019 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+
endstream
endobj
1323 0 obj
<</BBox[295.671 461.774 351.669 405.776]/Group 1338 0 R/Length 290/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1339 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 323.6699 445.7744 cm 0 0 m @@ -683,11 +674,11 @@ q 1 0 0 1 323.6699 445.7744 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1028 0 obj
<</Subtype/Form/Length 241/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1023 0 R/Resources<</XObject<</Fm0 1027 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+
endstream
endobj
1324 0 obj
<</BBox[309.171 492.275 321.168 480.278]/Group 1340 0 R/Length 292/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1341 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 315.165 487.2754 cm 0 0 m @@ -698,11 +689,12 @@ q 1 0 0 1 315.165 487.2754 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1038 0 obj
<</Subtype/Form/Length 262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1033 0 R/Resources<</XObject<</Fm0 1037 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+
endstream
endobj
1325 0 obj
<</BBox[156.837 462.278 212.835 406.271]/Group 1342 0 R/Length 290/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1343 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 184.8359 446.2783 cm 0 0 m @@ -713,11 +705,11 @@ q 1 0 0 1 184.8359 446.2783 cm f Q q -/Fm0 Do +0 g +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1045 0 obj
<</Subtype/Form/Length 240/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1040 0 R/Resources<</XObject<</Fm0 1044 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+
endstream
endobj
1326 0 obj
<</BBox[183.873 501.023 195.879 489.026]/Group 1344 0 R/Length 291/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1345 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn -1 i /GS0 gs q 1 0 0 1 189.876 496.0234 cm 0 0 m @@ -728,9 +720,11 @@ q 1 0 0 1 189.876 496.0234 cm f Q q -/Fm0 Do +0 g +1 w 4 M 0 j 0 J []0 d +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q -
endstream
endobj
1040 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1044 0 obj
<</Subtype/Form/Length 482/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1041 0 R/Resources<</XObject<</Fm0 1043 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+
endstream
endobj
1344 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1345 0 obj
<</BBox[183.873 501.023 195.879 489.026]/Group 1346 0 R/Length 534/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1347 0 R>>>>/Subtype/Form>>stream
q 189.876 496.023 m 189.876 501.023 l @@ -745,13 +739,13 @@ q 190.883 495.569 190.426 496.026 189.876 496.023 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1041 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1043 0 obj
<</Subtype/Form/Length 11006/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1042 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+
endstream
endobj
1346 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1347 0 obj
<</BBox[183.873 501.023 195.879 489.026]/Group 1348 0 R/Length 11001/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.2 0.325 0.624 scn -1 i /GS0 gs q 1 0 0 1 189.876 496.0234 cm 0 0 m @@ -1155,7 +1149,16 @@ q 1 0 0 1 189.876 501.0112 cm 0.15 0.006 0.046 -0.044 0 0 c f Q -
endstream
endobj
1042 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1033 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1037 0 obj
<</Subtype/Form/Length 482/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1034 0 R/Resources<</XObject<</Fm0 1036 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+
endstream
endobj
1348 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1318 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
1317 0 obj
[/ICCBased 1349 0 R]
endobj
1349 0 obj
<</Filter/FlateDecode/Length 2574/N 3>>stream
+H‰œ–yTSwÇoÉž•°Ãc
[€°5la‘QIBHØADED„ª•2ÖmtFOE.®cÖ}êÒõ0êè8´×Ž8GNg¦Óïï÷9÷wïïÝß½÷ó + +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó +€x¯Íú·¶Ò- +¨ê‡†¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r9‹\A&‘GÈ”ˆrQ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½ÄÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél
»—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â*6X[ݱF=3ë·YŸ±~dó ·‘ÛtÛ´¹iÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜IJlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§§|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßYÕ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø
Ú†žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝèþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMÅ›Î
nßLÝlÜ<9”úO +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ
æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ q 184.836 446.278 m 184.836 462.278 l @@ -1171,12 +1174,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1034 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1036 0 obj
<</Subtype/Form/Length 13533/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1035 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+
endstream
endobj
1350 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1351 0 obj
<</BBox[156.837 462.278 212.835 406.271]/Group 1352 0 R/Length 13528/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.208 0.337 0.655 scn -1 i /GS0 gs q 1 0 0 1 184.8359 446.2783 cm 0 0 m @@ -1634,7 +1636,7 @@ q 1 0 0 1 184.8359 462.2749 cm 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
1035 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1023 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1027 0 obj
<</Subtype/Form/Length 477/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1024 0 R/Resources<</XObject<</Fm0 1026 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+
endstream
endobj
1352 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1340 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1341 0 obj
<</BBox[309.171 492.275 321.168 480.278]/Group 1353 0 R/Length 529/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1354 0 R>>>>/Subtype/Form>>stream
q 315.165 487.275 m 315.165 492.275 l @@ -1649,13 +1651,13 @@ q 316.17 486.824 315.713 487.279 315.165 487.275 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1024 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1026 0 obj
<</Subtype/Form/Length 11079/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1025 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+
endstream
endobj
1353 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1354 0 obj
<</BBox[309.171 492.275 321.168 480.278]/Group 1355 0 R/Length 11074/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.2 0.325 0.624 scn -1 i /GS0 gs q 1 0 0 1 315.165 487.2754 cm 0 0 m @@ -2060,7 +2062,7 @@ q 1 0 0 1 315.165 492.2632 cm 0.15 0.006 0.046 -0.044 0 0 c f Q -
endstream
endobj
1025 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1015 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1019 0 obj
<</Subtype/Form/Length 473/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1016 0 R/Resources<</XObject<</Fm0 1018 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+
endstream
endobj
1355 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1338 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1339 0 obj
<</BBox[295.671 461.774 351.669 405.776]/Group 1356 0 R/Length 502/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1357 0 R>>>>/Subtype/Form>>stream
q 323.67 445.774 m 323.67 461.774 l @@ -2076,12 +2078,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1016 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1018 0 obj
<</Subtype/Form/Length 13391/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1017 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+
endstream
endobj
1356 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1357 0 obj
<</BBox[295.671 461.774 351.669 405.776]/Group 1358 0 R/Length 13386/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.208 0.337 0.655 scn -1 i /GS0 gs q 1 0 0 1 323.6699 445.7744 cm 0 0 m @@ -2536,7 +2537,7 @@ q 1 0 0 1 323.6699 461.771 cm 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
1017 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1005 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1009 0 obj
<</Subtype/Form/Length 478/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1006 0 R/Resources<</XObject<</Fm0 1008 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
+
endstream
endobj
1358 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1336 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1337 0 obj
<</BBox[321.996 217.271 334.002 205.274]/Group 1359 0 R/Length 530/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1360 0 R>>>>/Subtype/Form>>stream
q 327.999 212.271 m 327.999 217.271 l @@ -2551,13 +2552,13 @@ q 329.006 211.817 328.549 212.274 327.999 212.271 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
1006 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1008 0 obj
<</Subtype/Form/Length 11068/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1007 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
-/CS0 cs 0.294 0.494 0.133 scn -1 i +
endstream
endobj
1359 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1360 0 obj
<</BBox[321.996 217.271 334.002 205.274]/Group 1361 0 R/Length 11068/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.216 0.631 0.792 scn /GS0 gs q 1 0 0 1 327.999 212.2715 cm 0 0 m @@ -2598,7 +2599,7 @@ q 1 0 0 1 327.999 213.1963 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.208 0.616 0.776 scn q 1 0 0 1 327.999 213.3379 cm 0 0 m -0.03 -0.092 -0.164 -0.17 -0.185 -0.265 c @@ -2619,7 +2620,7 @@ q 1 0 0 1 327.999 213.3379 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.204 0.604 0.757 scn q 1 0 0 1 327.999 213.4785 cm 0 0 m -0.294 -0.83 -1.296 -1.345 -1.079 -2.404 c @@ -2636,7 +2637,7 @@ q 1 0 0 1 327.999 213.4785 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.2 0.588 0.741 scn q 1 0 0 1 327.999 213.6182 cm 0 0 m -0.352 -0.866 -1.383 -1.428 -1.146 -2.558 c @@ -2652,7 +2653,7 @@ q 1 0 0 1 327.999 213.6182 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.196 0.573 0.722 scn q 1 0 0 1 327.999 213.7549 cm 0 0 m -0.193 -0.417 -0.585 -0.691 -0.795 -1.098 c @@ -2669,7 +2670,7 @@ q 1 0 0 1 327.999 213.7549 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.188 0.561 0.702 scn q 1 0 0 1 327.999 213.9082 cm 0 0 m -0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c @@ -2686,7 +2687,7 @@ q 1 0 0 1 327.999 213.9082 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.184 0.545 0.686 scn q 1 0 0 1 327.999 214.0996 cm 0 0 m -0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c @@ -2703,7 +2704,7 @@ q 1 0 0 1 327.999 214.0996 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.18 0.529 0.667 scn q 1 0 0 1 327.999 214.2871 cm 0 0 m -0.037 -0.069 -0.152 -0.104 -0.217 -0.147 c @@ -2720,7 +2721,7 @@ q 1 0 0 1 327.999 214.2871 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.176 0.518 0.651 scn q 1 0 0 1 327.999 214.4717 cm 0 0 m -0.176 -0.317 -0.542 -0.437 -0.748 -0.722 c @@ -2737,7 +2738,7 @@ q 1 0 0 1 327.999 214.4717 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.169 0.502 0.631 scn q 1 0 0 1 327.999 214.7031 cm 0 0 m -0.06 -0.133 -0.265 -0.211 -0.386 -0.291 c @@ -2754,7 +2755,7 @@ q 1 0 0 1 327.999 214.7031 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.165 0.486 0.612 scn q 1 0 0 1 327.999 214.9854 cm 0 0 m -0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c @@ -2771,7 +2772,7 @@ q 1 0 0 1 327.999 214.9854 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.161 0.475 0.596 scn q 1 0 0 1 327.999 215.2715 cm 0 0 m -0.045 -0.106 -0.21 -0.167 -0.302 -0.236 c @@ -2788,7 +2789,7 @@ q 1 0 0 1 327.999 215.2715 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.157 0.459 0.576 scn q 1 0 0 1 327.999 215.6543 cm 0 0 m -0.163 -0.361 -0.542 -0.515 -0.779 -0.805 c @@ -2806,7 +2807,7 @@ q 1 0 0 1 327.999 215.6543 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.149 0.443 0.561 scn q 1 0 0 1 327.999 216.0791 cm 0 0 m -0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c @@ -2822,7 +2823,7 @@ q 1 0 0 1 327.999 216.0791 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.145 0.431 0.541 scn q 1 0 0 1 327.999 216.5439 cm 0 0 m -0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c @@ -2837,7 +2838,7 @@ q 1 0 0 1 327.999 216.5439 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.141 0.416 0.522 scn q 1 0 0 1 327.999 216.9863 cm 0 0 m -0.038 -0.066 -0.155 -0.09 -0.221 -0.129 c @@ -2852,7 +2853,7 @@ q 1 0 0 1 327.999 216.9863 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.137 0.4 0.506 scn q 1 0 0 1 327.999 217.2598 cm 0 0 m -0.043 -0.053 -0.154 -0.029 -0.221 -0.042 c @@ -2866,7 +2867,7 @@ q 1 0 0 1 327.999 217.2598 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.129 0.388 0.486 scn q 1 0 0 1 327.0938 217.1953 cm 0 0 m -1.738 -0.59 -1.75 -4.505 -1.75 -4.545 c @@ -2878,7 +2879,7 @@ q 1 0 0 1 327.0938 217.1953 cm 0.115 0.021 0.049 0.013 0 0 c f Q -0.173 0.29 0.078 scn +0.125 0.373 0.471 scn q 1 0 0 1 325.7642 216.7715 cm 0 0 m -1.064 -0.938 -0.813 -4.867 -0.541 -5.6 c @@ -2892,7 +2893,7 @@ q 1 0 0 1 325.7642 216.7715 cm 0.161 0.102 0.061 0.054 0 0 c f Q -0.302 0.506 0.137 scn +0.22 0.647 0.812 scn q 1 0 0 1 329.5791 211.4561 cm 0 0 m -0.095 0.068 -0.095 0.068 -0.519 0.587 c @@ -2903,7 +2904,7 @@ q 1 0 0 1 329.5791 211.4561 cm 0.153 -0.144 0.065 -0.047 0 0 c f Q -0.208 0.349 0.094 scn +0.149 0.443 0.561 scn q 1 0 0 1 330.5688 216.6631 cm 0 0 m -1.295 0.462 -2.254 -0.325 -2.57 -0.584 c @@ -2913,7 +2914,7 @@ q 1 0 0 1 330.5688 216.6631 cm 0.219 -0.095 0.096 -0.034 0 0 c f Q -0.306 0.518 0.141 scn +0.224 0.659 0.831 scn q 1 0 0 1 329.6191 211.708 cm 0 0 m -0.335 0.354 l @@ -2924,7 +2925,7 @@ q 1 0 0 1 329.6191 211.708 cm 0.106 -0.131 0.048 -0.039 0 0 c f Q -0.2 0.337 0.09 scn +0.145 0.431 0.541 scn q 1 0 0 1 329.7661 216.9941 cm 0 0 m -0.649 0.12 -1.161 -0.01 -1.767 -0.45 c @@ -2934,7 +2935,7 @@ q 1 0 0 1 329.7661 216.9941 cm 0.02 -0.005 0.009 -0.002 0 0 c f Q -0.314 0.525 0.145 scn +0.227 0.675 0.847 scn q 1 0 0 1 329.623 211.9746 cm 0 0 m -0.004 0.004 -0.533 0.572 -0.71 0.861 c @@ -2945,7 +2946,7 @@ q 1 0 0 1 329.623 211.9746 cm 0.052 -0.044 0.021 -0.021 0 0 c f Q -0.192 0.325 0.09 scn +0.141 0.416 0.522 scn q 1 0 0 1 328.9043 217.1943 cm 0 0 m -0.314 -0.006 -0.487 -0.009 -0.905 -0.208 c @@ -2954,7 +2955,7 @@ q 1 0 0 1 328.9043 217.1943 cm 0.157 -0.021 0.068 -0.004 0 0 c f Q -0.188 0.314 0.086 scn +0.137 0.4 0.506 scn q 1 0 0 1 327.999 217.2598 cm 0 0 m 0 0.012 l @@ -2962,7 +2963,7 @@ q 1 0 0 1 327.999 217.2598 cm 0.15 0.006 0.046 -0.045 0 0 c f Q -
endstream
endobj
1007 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
998 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1002 0 obj
<</Subtype/Form/Length 475/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 999 0 R/Resources<</XObject<</Fm0 1001 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
+
endstream
endobj
1361 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1334 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1335 0 obj
<</BBox[306.003 319.277 362.001 263.279]/Group 1362 0 R/Length 504/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1363 0 R>>>>/Subtype/Form>>stream
q 334.002 303.277 m 334.002 319.277 l @@ -2978,12 +2979,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
999 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1001 0 obj
<</Subtype/Form/Length 13469/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1000 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
-/CS0 cs 0.306 0.518 0.141 scn -1 i +
endstream
endobj
1362 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1363 0 obj
<</BBox[306.003 319.277 362.001 263.279]/Group 1364 0 R/Length 13467/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.259 0.565 0.682 scn /GS0 gs q 1 0 0 1 334.002 303.2773 cm 0 0 m @@ -3022,7 +3022,7 @@ q 1 0 0 1 334.002 308.4409 cm 0 0 l f Q -0.302 0.506 0.137 scn +0.255 0.553 0.667 scn q 1 0 0 1 334.002 310.2881 cm 0 0 m -0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c @@ -3048,7 +3048,7 @@ q 1 0 0 1 334.002 310.2881 cm 0 0 l f Q -0.294 0.494 0.133 scn +0.247 0.541 0.651 scn q 1 0 0 1 334.002 311.4072 cm 0 0 m -0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c @@ -3073,7 +3073,7 @@ q 1 0 0 1 334.002 311.4072 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.243 0.529 0.639 scn q 1 0 0 1 334.002 312.3325 cm 0 0 m -0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c @@ -3093,7 +3093,7 @@ q 1 0 0 1 334.002 312.3325 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.235 0.518 0.624 scn q 1 0 0 1 334.002 313.1323 cm 0 0 m -0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c @@ -3110,7 +3110,7 @@ q 1 0 0 1 334.002 313.1323 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.231 0.506 0.608 scn q 1 0 0 1 334.002 313.833 cm 0 0 m -0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c @@ -3127,7 +3127,7 @@ q 1 0 0 1 334.002 313.833 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.227 0.494 0.592 scn q 1 0 0 1 334.002 314.499 cm 0 0 m -0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c @@ -3144,7 +3144,7 @@ q 1 0 0 1 334.002 314.499 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.22 0.478 0.576 scn q 1 0 0 1 334.002 315.1099 cm 0 0 m -0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c @@ -3161,7 +3161,7 @@ q 1 0 0 1 334.002 315.1099 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.216 0.467 0.565 scn q 1 0 0 1 334.002 315.6826 cm 0 0 m -0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c @@ -3178,7 +3178,7 @@ q 1 0 0 1 334.002 315.6826 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.208 0.455 0.549 scn q 1 0 0 1 334.002 316.2197 cm 0 0 m -0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c @@ -3195,7 +3195,7 @@ q 1 0 0 1 334.002 316.2197 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.204 0.443 0.533 scn q 1 0 0 1 334.002 316.7344 cm 0 0 m -0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c @@ -3212,7 +3212,7 @@ q 1 0 0 1 334.002 316.7344 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.196 0.431 0.518 scn q 1 0 0 1 334.002 317.207 cm 0 0 m -0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c @@ -3229,7 +3229,7 @@ q 1 0 0 1 334.002 317.207 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.192 0.42 0.506 scn q 1 0 0 1 334.002 317.647 cm 0 0 m -0.165 -0.201 -0.596 -0.119 -0.852 -0.169 c @@ -3246,7 +3246,7 @@ q 1 0 0 1 334.002 317.647 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.188 0.408 0.49 scn q 1 0 0 1 334.002 318.0581 cm 0 0 m -0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c @@ -3263,7 +3263,7 @@ q 1 0 0 1 334.002 318.0581 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.18 0.392 0.475 scn q 1 0 0 1 334.002 318.4131 cm 0 0 m -0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c @@ -3280,7 +3280,7 @@ q 1 0 0 1 334.002 318.4131 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.176 0.38 0.459 scn q 1 0 0 1 334.002 318.7388 cm 0 0 m -0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c @@ -3295,7 +3295,7 @@ q 1 0 0 1 334.002 318.7388 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.169 0.369 0.443 scn q 1 0 0 1 334.002 318.9941 cm 0 0 m -0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c @@ -3310,7 +3310,7 @@ q 1 0 0 1 334.002 318.9941 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.165 0.357 0.431 scn q 1 0 0 1 334.002 319.1851 cm 0 0 m -0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c @@ -3325,7 +3325,7 @@ q 1 0 0 1 334.002 319.1851 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.157 0.345 0.416 scn q 1 0 0 1 334.002 319.2739 cm 0 0 m -0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c @@ -3339,7 +3339,7 @@ q 1 0 0 1 334.002 319.2739 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.153 0.333 0.4 scn q 1 0 0 1 329.771 318.957 cm 0 0 m -22.534 -4.552 -23.533 -35.028 -6.33 -46.26 c @@ -3350,7 +3350,7 @@ q 1 0 0 1 329.771 318.957 cm 0.544 0.077 0.232 0.04 0 0 c f Q -0.173 0.29 0.078 scn +0.145 0.322 0.384 scn q 1 0 0 1 321.978 316.4971 cm 0 0 m -16.565 -9.063 -17.347 -40.195 9.314 -48.713 c @@ -3362,7 +3362,7 @@ q 1 0 0 1 321.978 316.4971 cm 1.31 0.61 0.543 0.297 0 0 c f Q -0.314 0.525 0.145 scn +0.267 0.58 0.698 scn q 1 0 0 1 349.9282 293.1025 cm 0 0 m -1.706 2.422 -2.871 5.191 -4.806 7.466 c @@ -3376,7 +3376,7 @@ q 1 0 0 1 349.9282 293.1025 cm 0.589 -1.328 0.314 -0.446 0 0 c f Q -0.322 0.537 0.145 scn +0.271 0.592 0.71 scn q 1 0 0 1 350.0625 295.5957 cm 0 0 m -1.97 2.883 -3.056 4.472 -4.87 6.595 c @@ -3393,7 +3393,7 @@ q 1 0 0 1 350.0625 295.5957 cm 0.33 -0.793 0.182 -0.267 0 0 c f Q -0.325 0.549 0.149 scn +0.278 0.604 0.725 scn q 1 0 0 1 349.1475 299.125 cm 0 0 m -0.737 0.235 -1.076 1.45 -1.576 2.04 c @@ -3406,7 +3406,7 @@ q 1 0 0 1 349.1475 299.125 cm 0.026 0.014 0.011 -0.003 0 0 c f Q -0.208 0.349 0.094 scn +0.176 0.38 0.459 scn q 1 0 0 1 346.0513 316.5498 cm 0 0 m -5.275 2.417 -9.403 2.407 -12.049 2.189 c @@ -3416,7 +3416,7 @@ q 1 0 0 1 346.0513 316.5498 cm 0.673 -0.334 0.292 -0.134 0 0 c f Q -0.2 0.337 0.09 scn +0.169 0.369 0.443 scn q 1 0 0 1 342.2651 318.0342 cm 0 0 m -3.078 0.794 -4.478 1.111 -8.263 0.96 c @@ -3425,7 +3425,7 @@ q 1 0 0 1 342.2651 318.0342 cm 0.981 -0.329 0.425 -0.126 0 0 c f Q -0.192 0.325 0.09 scn +0.165 0.357 0.431 scn q 1 0 0 1 338.2329 318.957 cm 0 0 m -2.557 0.263 -2.657 0.273 -4.231 0.228 c @@ -3434,14 +3434,14 @@ q 1 0 0 1 338.2329 318.957 cm 0.724 -0.122 0.312 -0.042 0 0 c f Q -0.188 0.314 0.086 scn +0.157 0.345 0.416 scn q 1 0 0 1 334.002 319.2739 cm 0 0 m 0.335 0.003 0.669 -0.002 1.001 -0.014 c 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
1000 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
988 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
992 0 obj
<</Subtype/Form/Length 481/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 989 0 R/Resources<</XObject<</Fm0 991 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
+
endstream
endobj
1364 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1332 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1333 0 obj
<</BBox[180.624 223.274 192.621 211.277]/Group 1365 0 R/Length 533/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1366 0 R>>>>/Subtype/Form>>stream
q 186.627 218.274 m 186.627 223.274 l @@ -3456,13 +3456,13 @@ q 187.622 217.829 187.171 218.277 186.627 218.274 c W n q +1 w 4 M 0 j 0 J []0 d /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
989 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
991 0 obj
<</Subtype/Form/Length 11020/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 990 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
-/CS0 cs 0.294 0.494 0.133 scn -1 i +
endstream
endobj
1365 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1366 0 obj
<</BBox[180.624 223.274 192.621 211.277]/Group 1367 0 R/Length 11024/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.176 0.529 0.353 scn /GS0 gs q 1 0 0 1 186.627 218.2744 cm 0 0 m @@ -3503,7 +3503,7 @@ q 1 0 0 1 186.627 219.1992 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.173 0.518 0.345 scn q 1 0 0 1 186.627 219.3418 cm 0 0 m -0.03 -0.093 -0.164 -0.171 -0.185 -0.266 c @@ -3524,7 +3524,7 @@ q 1 0 0 1 186.627 219.3418 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.169 0.506 0.337 scn q 1 0 0 1 186.627 219.4824 cm 0 0 m -0.295 -0.834 -1.295 -1.352 -1.079 -2.413 c @@ -3540,7 +3540,7 @@ q 1 0 0 1 186.627 219.4824 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.165 0.49 0.329 scn q 1 0 0 1 186.627 219.6211 cm 0 0 m -0.353 -0.868 -1.382 -1.434 -1.146 -2.564 c @@ -3556,7 +3556,7 @@ q 1 0 0 1 186.627 219.6211 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.161 0.478 0.322 scn q 1 0 0 1 186.627 219.7588 cm 0 0 m -0.193 -0.418 -0.584 -0.692 -0.794 -1.099 c @@ -3573,7 +3573,7 @@ q 1 0 0 1 186.627 219.7588 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.157 0.467 0.314 scn q 1 0 0 1 186.627 219.9111 cm 0 0 m -0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c @@ -3590,7 +3590,7 @@ q 1 0 0 1 186.627 219.9111 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.153 0.455 0.306 scn q 1 0 0 1 186.627 220.1025 cm 0 0 m -0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c @@ -3607,7 +3607,7 @@ q 1 0 0 1 186.627 220.1025 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.149 0.443 0.294 scn q 1 0 0 1 186.627 220.291 cm 0 0 m -0.037 -0.07 -0.152 -0.104 -0.217 -0.148 c @@ -3624,7 +3624,7 @@ q 1 0 0 1 186.627 220.291 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.145 0.431 0.286 scn q 1 0 0 1 186.627 220.4746 cm 0 0 m -0.175 -0.316 -0.542 -0.436 -0.748 -0.721 c @@ -3641,7 +3641,7 @@ q 1 0 0 1 186.627 220.4746 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.141 0.42 0.278 scn q 1 0 0 1 186.627 220.7061 cm 0 0 m -0.06 -0.132 -0.265 -0.211 -0.386 -0.291 c @@ -3658,7 +3658,7 @@ q 1 0 0 1 186.627 220.7061 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.137 0.408 0.271 scn q 1 0 0 1 186.627 220.9883 cm 0 0 m -0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c @@ -3675,7 +3675,7 @@ q 1 0 0 1 186.627 220.9883 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.133 0.396 0.263 scn q 1 0 0 1 186.627 221.2744 cm 0 0 m -0.045 -0.106 -0.21 -0.167 -0.303 -0.236 c @@ -3692,7 +3692,7 @@ q 1 0 0 1 186.627 221.2744 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.129 0.384 0.255 scn q 1 0 0 1 186.627 221.6582 cm 0 0 m -0.163 -0.362 -0.542 -0.515 -0.779 -0.805 c @@ -3710,7 +3710,7 @@ q 1 0 0 1 186.627 221.6582 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 186.627 222.082 cm 0 0 m -0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c @@ -3726,7 +3726,7 @@ q 1 0 0 1 186.627 222.082 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 186.627 222.5469 cm 0 0 m -0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c @@ -3741,7 +3741,7 @@ q 1 0 0 1 186.627 222.5469 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 186.627 222.9893 cm 0 0 m -0.038 -0.066 -0.155 -0.09 -0.221 -0.129 c @@ -3756,7 +3756,7 @@ q 1 0 0 1 186.627 222.9893 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 186.627 223.2627 cm 0 0 m -0.043 -0.052 -0.154 -0.029 -0.221 -0.042 c @@ -3770,7 +3770,7 @@ q 1 0 0 1 186.627 223.2627 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.11 0.325 0.216 scn q 1 0 0 1 185.7217 223.1973 cm 0 0 m -1.735 -0.588 -1.748 -4.507 -1.748 -4.547 c @@ -3782,7 +3782,7 @@ q 1 0 0 1 185.7217 223.1973 cm 0.115 0.022 0.049 0.014 0 0 c f Q -0.173 0.29 0.078 scn +0.106 0.314 0.208 scn q 1 0 0 1 184.3926 222.7744 cm 0 0 m -1.065 -0.939 -0.813 -4.875 -0.541 -5.608 c @@ -3796,7 +3796,7 @@ q 1 0 0 1 184.3926 222.7744 cm 0.161 0.103 0.062 0.054 0 0 c f Q -0.302 0.506 0.137 scn +0.18 0.541 0.361 scn q 1 0 0 1 188.1982 217.4531 cm 0 0 m -0.089 0.064 -0.089 0.064 -0.518 0.595 c @@ -3807,7 +3807,7 @@ q 1 0 0 1 188.1982 217.4531 cm 0.153 -0.145 0.065 -0.047 0 0 c f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 189.1953 222.666 cm 0 0 m -1.292 0.462 -2.253 -0.325 -2.568 -0.584 c @@ -3817,7 +3817,7 @@ q 1 0 0 1 189.1953 222.666 cm 0.215 -0.093 0.095 -0.034 0 0 c f Q -0.306 0.518 0.141 scn +0.184 0.553 0.369 scn q 1 0 0 1 188.2393 217.709 cm 0 0 m -0.336 0.357 l @@ -3828,7 +3828,7 @@ q 1 0 0 1 188.2393 217.709 cm 0.105 -0.132 0.047 -0.039 0 0 c f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 188.3931 222.9971 cm 0 0 m -0.649 0.121 -1.161 -0.01 -1.766 -0.45 c @@ -3838,7 +3838,7 @@ q 1 0 0 1 188.3931 222.9971 cm 0.019 -0.004 0.008 -0.001 0 0 c f Q -0.314 0.525 0.145 scn +0.188 0.565 0.376 scn q 1 0 0 1 188.2437 217.9775 cm 0 0 m -0.004 0.005 -0.532 0.572 -0.709 0.863 c @@ -3849,7 +3849,7 @@ q 1 0 0 1 188.2437 217.9775 cm 0.049 -0.041 0.02 -0.02 0 0 c f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 187.5317 223.1973 cm 0 0 m -0.313 -0.006 -0.486 -0.009 -0.905 -0.208 c @@ -3858,7 +3858,7 @@ q 1 0 0 1 187.5317 223.1973 cm 0.157 -0.021 0.068 -0.004 0 0 c f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 186.627 223.2627 cm 0 0 m 0 0.012 l @@ -3866,7 +3866,7 @@ q 1 0 0 1 186.627 223.2627 cm 0.15 0.006 0.046 -0.045 0 0 c f Q -
endstream
endobj
990 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
979 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
985 0 obj
<</Subtype/Form/Length 450/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 980 0 R/Resources<</XObject<</Fm0 984 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[155.001 324.272 210.999 268.274]>>stream
+
endstream
endobj
1367 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1330 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1331 0 obj
<</BBox[155.001 324.272 210.999 268.274]/Group 1368 0 R/Length 479/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1369 0 R>>>>/Subtype/Form>>stream
q 183 308.272 m 183 324.272 l @@ -3882,12 +3882,11 @@ q W n q /GS0 gs -/Fm0 Do +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do Q Q -
endstream
endobj
980 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
984 0 obj
<</Subtype/Form/Length 13394/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 981 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[155.001 324.272 210.999 268.274]>>stream
-/CS0 cs 0.306 0.518 0.141 scn -1 i +
endstream
endobj
1368 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1369 0 obj
<</BBox[155.001 324.272 210.999 268.274]/Group 1370 0 R/Length 13398/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.184 0.553 0.369 scn /GS0 gs q 1 0 0 1 183 308.2725 cm 0 0 m @@ -3926,7 +3925,7 @@ q 1 0 0 1 183 313.436 cm 0 0 l f Q -0.302 0.506 0.137 scn +0.18 0.541 0.361 scn q 1 0 0 1 183 315.2832 cm 0 0 m -0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c @@ -3952,7 +3951,7 @@ q 1 0 0 1 183 315.2832 cm 0 0 l f Q -0.294 0.494 0.133 scn +0.176 0.529 0.353 scn q 1 0 0 1 183 316.4023 cm 0 0 m -0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c @@ -3977,7 +3976,7 @@ q 1 0 0 1 183 316.4023 cm 0 0 l f Q -0.286 0.482 0.133 scn +0.173 0.518 0.345 scn q 1 0 0 1 183 317.3276 cm 0 0 m -0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c @@ -3997,7 +3996,7 @@ q 1 0 0 1 183 317.3276 cm 0 0 l f Q -0.278 0.471 0.129 scn +0.169 0.506 0.337 scn q 1 0 0 1 183 318.1274 cm 0 0 m -0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c @@ -4014,7 +4013,7 @@ q 1 0 0 1 183 318.1274 cm 0 0 l f Q -0.275 0.459 0.125 scn +0.165 0.49 0.329 scn q 1 0 0 1 183 318.8281 cm 0 0 m -0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c @@ -4031,7 +4030,7 @@ q 1 0 0 1 183 318.8281 cm 0 0 l f Q -0.267 0.447 0.122 scn +0.161 0.478 0.322 scn q 1 0 0 1 183 319.4941 cm 0 0 m -0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c @@ -4048,7 +4047,7 @@ q 1 0 0 1 183 319.4941 cm 0 0 l f Q -0.259 0.439 0.118 scn +0.157 0.467 0.314 scn q 1 0 0 1 183 320.105 cm 0 0 m -0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c @@ -4065,7 +4064,7 @@ q 1 0 0 1 183 320.105 cm 0 0 l f Q -0.255 0.427 0.118 scn +0.153 0.455 0.306 scn q 1 0 0 1 183 320.6777 cm 0 0 m -0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c @@ -4082,7 +4081,7 @@ q 1 0 0 1 183 320.6777 cm 0 0 l f Q -0.247 0.416 0.114 scn +0.149 0.443 0.294 scn q 1 0 0 1 183 321.2148 cm 0 0 m -0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c @@ -4099,7 +4098,7 @@ q 1 0 0 1 183 321.2148 cm 0 0 l f Q -0.239 0.404 0.11 scn +0.145 0.431 0.286 scn q 1 0 0 1 183 321.7295 cm 0 0 m -0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c @@ -4116,7 +4115,7 @@ q 1 0 0 1 183 321.7295 cm 0 0 l f Q -0.235 0.392 0.106 scn +0.141 0.42 0.278 scn q 1 0 0 1 183 322.2021 cm 0 0 m -0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c @@ -4133,7 +4132,7 @@ q 1 0 0 1 183 322.2021 cm 0 0 l f Q -0.227 0.38 0.106 scn +0.137 0.408 0.271 scn q 1 0 0 1 183 322.6421 cm 0 0 m -0.165 -0.201 -0.596 -0.119 -0.851 -0.169 c @@ -4150,7 +4149,7 @@ q 1 0 0 1 183 322.6421 cm 0 0 l f Q -0.22 0.369 0.102 scn +0.133 0.396 0.263 scn q 1 0 0 1 183 323.0532 cm 0 0 m -0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c @@ -4167,7 +4166,7 @@ q 1 0 0 1 183 323.0532 cm 0 0 l f Q -0.212 0.361 0.098 scn +0.129 0.384 0.255 scn q 1 0 0 1 183 323.4082 cm 0 0 m -0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c @@ -4184,7 +4183,7 @@ q 1 0 0 1 183 323.4082 cm 0 0 l f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 183 323.7339 cm 0 0 m -0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c @@ -4199,7 +4198,7 @@ q 1 0 0 1 183 323.7339 cm 0 0 l f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 183 323.9893 cm 0 0 m -0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c @@ -4214,7 +4213,7 @@ q 1 0 0 1 183 323.9893 cm 0 0 l f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 183 324.1802 cm 0 0 m -0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c @@ -4229,7 +4228,7 @@ q 1 0 0 1 183 324.1802 cm 0 0 l f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 183 324.269 cm 0 0 m -0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c @@ -4243,7 +4242,7 @@ q 1 0 0 1 183 324.269 cm 0 0 l f Q -0.18 0.302 0.082 scn +0.11 0.325 0.216 scn q 1 0 0 1 178.769 323.9521 cm 0 0 m -22.529 -4.551 -23.528 -35.026 -6.329 -46.258 c @@ -4254,7 +4253,7 @@ q 1 0 0 1 178.769 323.9521 cm 0.544 0.077 0.232 0.04 0 0 c f Q -0.173 0.29 0.078 scn +0.106 0.314 0.208 scn q 1 0 0 1 170.9761 321.4922 cm 0 0 m -16.563 -9.063 -17.344 -40.194 9.316 -48.713 c @@ -4266,7 +4265,7 @@ q 1 0 0 1 170.9761 321.4922 cm 1.31 0.61 0.543 0.297 0 0 c f Q -0.314 0.525 0.145 scn +0.188 0.565 0.376 scn q 1 0 0 1 198.9263 298.0972 cm 0 0 m -1.706 2.422 -2.871 5.192 -4.806 7.466 c @@ -4280,7 +4279,7 @@ q 1 0 0 1 198.9263 298.0972 cm 0.589 -1.328 0.314 -0.445 0 0 c f Q -0.322 0.537 0.145 scn +0.192 0.576 0.384 scn q 1 0 0 1 199.0605 300.5908 cm 0 0 m -1.97 2.883 -3.055 4.471 -4.87 6.595 c @@ -4297,7 +4296,7 @@ q 1 0 0 1 199.0605 300.5908 cm 0.33 -0.793 0.182 -0.267 0 0 c f Q -0.325 0.549 0.149 scn +0.196 0.588 0.392 scn q 1 0 0 1 198.1455 304.1201 cm 0 0 m -0.737 0.235 -1.076 1.45 -1.576 2.04 c @@ -4310,7 +4309,7 @@ q 1 0 0 1 198.1455 304.1201 cm 0.026 0.014 0.011 -0.003 0 0 c f Q -0.208 0.349 0.094 scn +0.125 0.373 0.247 scn q 1 0 0 1 195.0493 321.5449 cm 0 0 m -5.275 2.417 -9.403 2.407 -12.049 2.189 c @@ -4320,7 +4319,7 @@ q 1 0 0 1 195.0493 321.5449 cm 0.673 -0.334 0.292 -0.134 0 0 c f Q -0.2 0.337 0.09 scn +0.122 0.361 0.239 scn q 1 0 0 1 191.2632 323.0293 cm 0 0 m -3.078 0.794 -4.478 1.111 -8.263 0.96 c @@ -4329,7 +4328,7 @@ q 1 0 0 1 191.2632 323.0293 cm 0.981 -0.329 0.425 -0.126 0 0 c f Q -0.192 0.325 0.09 scn +0.118 0.349 0.231 scn q 1 0 0 1 187.231 323.9521 cm 0 0 m -2.557 0.263 -2.657 0.273 -4.231 0.228 c @@ -4338,636 +4337,656 @@ q 1 0 0 1 187.231 323.9521 cm 0.724 -0.122 0.312 -0.042 0 0 c f Q -0.188 0.314 0.086 scn +0.114 0.337 0.224 scn q 1 0 0 1 183 324.269 cm 0 0 m 0.335 0.003 0.669 -0.002 1.001 -0.014 c 0.701 -0.01 0.211 -0.214 0 0 c f Q -
endstream
endobj
981 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1051 0 obj
[/Indexed/DeviceRGB 255 1052 0 R]
endobj
1052 0 obj
<</Length 428/Filter[/ASCII85Decode/FlateDecode]>>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 -VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< -PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
962 0 obj
<</Private 963 0 R/LastModified(D:20100413200510+02'00')>>
endobj
963 0 obj
<</RoundtripVersion 13/CreatorVersion 13/ContainerVersion 11/AIMetaData 964 0 R/AIPrivateData1 965 0 R/AIPrivateData2 966 0 R/AIPrivateData3 967 0 R/AIPrivateData4 968 0 R/NumBlock 4/RoundtripStreamType 1>>
endobj
964 0 obj
<</Length 974>>stream
-%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 13.0
%%AI8_CreatorVersion: 13.0.2
%%For: (Gilles Dubochet) ()
%%Title: (type_tags.ai)
%%CreationDate: 4/13/10 8:05 PM
%%BoundingBox: -227 -99 143 234
%%HiResBoundingBox: -226.5 -98.5 142.5908 233.748
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 9.0
%AI12_BuildNumber: 434
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: -59.5 -62.5 -46.5 -49.5
%AI3_TemplateBox: 40.5 29.5 40.5 29.5
%AI3_TileBox: -239.5552 -349.6377 319.4453 433.3623
%AI3_DocumentPreview: None
%AI5_ArtSize: 841.8898 595.2756
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 5
%AI9_OpenToView: -285.3354 49.2085 4.4426 1589 965 18 0 0 470 360 0 0 1 1 1 0 1
%AI5_OpenViewLayers: 77777
%%PageOrigin:-399 227
%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
965 0 obj
<</Length 7512>>stream
-%%BoundingBox: -227 -63 143 234
%%HiResBoundingBox: -226.5 -62.001 142.5908 233.748
%AI7_Thumbnail: 128 104 8
%%BeginData: 7364 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FD0AFFA8282F53FD7CFF06A8FF5359FD7AFFA92EA8FF537EFD7BFF
%53282E28A8FD27FF2E2828A8FD51FF847EAFFD27FF5953AFA928FD7BFF59
%2EFFA82FA8FD7AFF847E7E2E59FD7CFFA87D7DFDFCFFFDFCFFFD31FFA9FF
%FFFFA9FFFFFFA9FD76FFA9FFA9AFA9FFA9AFA9FFA9AFA9FD1AFFA87E537E
%A8FD2BFFA8A9A8AFA8FD23FFA9A9A8A9A8A9A8A9A8A9A8A9A8AFFD17FFA9
%7E282F282F282F2F7EA8FD26FFA8532F282F282F53A8FD22FFA9AFA9AFA9
%AFA9AFA9AFA9AFA9FD16FF7E2E0128062F292F292F062F7EFD23FFA85906
%28062F282F2829065384FD1FFFA8A9A8A9A8A9A8A9A8A9A8A984FD16FF84
%28062F292F292F29542F30292FA8FD21FFA853062928FD042F542F30292F
%84FD1FFFA9AFA9FFA9AFA9FFA9AFA9AFA9FD09FFA8A87DFF7DFFA8FD04FF
%A8280529282929535353292F292F292FA8FD1FFFA92F00280629062F292F
%292F292F292FA8FD1DFFA8A9A8A9A8A9A8A9A8A9A8A9A8FD04FFA87DFF7D
%FFA852275227277D27A8FFFFFF530628282F5AA9FD04FF7E302F302953FD
%1FFF7E06282FA984A82F7EA8A9847E2F302953FD1EFFA9AFA9AFA9AFA9AF
%A9AFA9A9A9FFFFFF52FF5227527D7D52527D527DF8A8FFFFA8002806297E
%FD07FF7E30292F06A8FD1DFFA905280653FFFFFFA9FD05FF7E292F0684FD
%1CFFA8A9A8A9A8A9A8A9A8A9A8A9A8AFFFFFA8527D7D27A8FD05527DFF7D
%A8FFFF5328282959FD04FFA9FD04FF7E302F2F59FD1DFF7D28282953FD0A
%FF5A292F53FD1DFFA9FFA9AFA9FFA9AFA9FFA9AFA9FD09FFA8FFA8FD06FF
%A82E002806A9FFFFFF7E067EFD04FF292F292FA8FD1CFF5300280653FD04
%FF5A5AA9FFFFFF7E2F292FA8FD1BFFA9A9A8A9A8A9A8A9A8A9A8A9A8FD14
%FF2828062FFD04FF2F2F29FD04FF542F2F28FD1DFF2E28062953FFFFFFA8
%2F067EFFFFFFA92F2F28FD1DFFA9AFA9AFA9AFA9AFA9AFA9AFA9FD12FFA8
%28052828FFFFFFA82F292FA8FFFFFF2F2F2929A8FD1BFF842805280659FF
%FFFF8407292FFFFFFF842F2929A8FD1BFFA8A9A8A9A8A9A8A9A8A9A8A9A8
%FD14FF2828062FFD04FF2F292FFD04FF54292F28FD1DFF5328282953FFFF
%FFA82F077EFFFFFFAF292F28FD1DFFA9FFA9FFA9FFA9FFA9FFA9FD15FF53
%002806A8FFFFFFA92984FFFFFFA8072F0653A8FD1CFF7D00280659FD04FF
%532FA8FFFFFF7E29282FA8FD1BFFFD04532E5353532E535353287EFD13FF
%7D2828282FFD09FF532F28297DFD1DFF7E28282853FD0AFF53282953FD1C
%FF5300280006002800060028000053FD13FFA92828060653FD07FF532928
%2828FD1FFF28280053FD09FF7E062806A8FD1CFF2E050028000600280006
%00280053FD14FFA8062828282E7E84AFA87E292F282F06A8FD1FFFA80628
%53FFFFFFA8A9FFFFA87E282F067DFD1DFF53002806280528062805280606
%53FD15FF7D0028052806280628062806280059FD21FF7D0053FFFFFF7E06
%2F28280628012EA8FD1DFF2E06002800280028002800280053FD04FFA8FF
%FFFFA8FFFFA8A8FFA8FD07FF7E06280628282806282828067EFD23FF5952
%FFFFFF7E28062828280053A8FD1EFF5300280528062805280628050653FF
%FFFF7D52FF7D52A852A852A8527DFF7D7DFD04FFA9A82828000600060028
%28A8FD24FFA8A8A9FFFF8400060028287DA8FD1FFF280600060028000600
%2800060059FFFFFFA852A8277DFF7D527DA8527D7D27A8FD07FFA87E597D
%537EA8FD2BFFA8282E7D7DFD22FF5300280528062805280628052853FFFF
%FFA87DA852527D52FF527DA852527D27FD3AFFA8FD25FF2E060028002800
%28002800280059FD04FF7DFFFFA8527D7D7DA87D7DFF7DA8FD60FF530028
%0628052806280528060653FD72FF2E05002800060028000600280053FD72
%FF5300280628052806280528060653FD72FF280000060006000600060006
%0053FD72FF7E2E532E5353532E5353532E537DFDFCFFFDFCFFFDFCFFFDFC
%FFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD9AFFCACAA8CAA8CAA8CA
%A8CAA8CAA8FD74FFFD0DCAFD18FFA8A8587C5883A8FD53FFCACAA8CAA8CA
%A8CAA8CAA8CAA8CAFD17FF7C51262D2C2D2C5151A8FD52FFFD0DCAFD15FF
%A82D2C262D2C512C2D2C2D2C7CA8FD29FFA87D5258515858A8FD1EFFA8CA
%A8CAA8CAA8CAA8CAA8CAA1FD05FFA8FFA8FD0DFFAE2D2D2D512D572D572D
%5757572C7CFD28FF7C51262D2C2D2C2D2D58A8FD1DFFCACACAFFCACACAFF
%FD05CAFFFFFFFD047DFD0DFF2D26262D2C2D2C5757582D572D572C7CFD25
%FFA82D2C262D2C2D2D572C572C2D7DFD1BFFA8CAA8CAA8CAA8CAA8CAA8CA
%A8FD04FFFD04527D7D7D275252A85252A8FFFF582C2C2D2C577CCFFD04FF
%FD04572CA8FD24FF2D2C2C51517C83FF57572D572D2D7DFD1BFFFD0DCAFF
%FFFF52A8522752FF525227A8A82752FFFFA82D042D2C2D83FD06FF572C57
%2D2D51FD23FF5126262D2CA8FFFFFF582C572C572C2D83FD19FFA8CAA8CA
%A8CAA8CAA8CAA8CAA8CAFFFFFFA8A8FFA8A87DFF7DA852A87D7DFFFFA726
%2D2D2D83FD05FFCFAE2D5757572D57A8FD21FF832D2C2D2C57A8FFFFFF58
%57335757572C7CFD1AFFCAFFCACACAFFCACACAFFCACACAFD12FF5226262D
%2DFD04FF832C572D572C572D572CA7FD21FF58042D2C51A8FD06FF7C2C57
%2D572CA8FD18FFCACAA8CAA8CAA8CAA8CAA8CAA8CAFD12FF7D042D267CFF
%FFFFCF2C572C572D572D572D2D58FD21FF272D262D2DFD07FF58572D5733
%2D7CFD19FFFD0DCAFD12FF5226262C51FFFFFF832D2C2D2C572C572C572C
%7CFD20FFA82D262D2657A7FD04FFA8A7582C572C572C58FD18FFCAFFCACA
%CAFFCACACAFFCACACAFD13FF7D262D267CFD04FF572D2C572D572D572D2D
%83FD20FFA8262D2C512D57A8FFFFFF57572D572D572D2D58FD18FFA176A1
%76A176A176A176A1769AA1FD12FF7D2D262D2CFD05FF7C7D7C572C572C2D
%2CAEFD20FF832D262D2C512CA8FFFFFF572C572D572C572C58FD18FF4BFD
%0420442020204420202076FD13FF272D262C7CFD07FF2D572D512658FD22
%FF262D2C2D2C57A8FFFFFF57572D572D572D2D7CFD18FF76204B444B204B
%444B204B444476FD13FF7C042D262C7CFD06FF572C2D2C2C7DFD21FFA851
%042D262D2CA8FFFFFF582C512C572C2D0483FD18FF4B20204B2044204B20
%44204B2076FD13FFAE52262D262D518383A8A7832D512D2C58FD23FF7C2D
%262D2C2DA7FFFFFFAEA857572D572C51AEFD18FF76204B444B204B444B20
%4B444476FD07FFA8FD0CFFA72D042D262D042C262D042D262651FD24FFAE
%2626262D047DFD05FF582C2D2C2C58FD19FF4B44204B2045204B2045204B
%2076FFFFFF7D7DFF52A87D52FF7D52A852FF527DFFFFFFA852042C262D26
%2D262D262C52FD26FFA8042D262D2CAEFD04FF512D2C2D51FD1AFF76204B
%204B444B204B444B204476FFFFFF52A87D52A8FF52A8277DA87DA85252FD
%04FFA87D27260426042604517DFD28FF7D04262626047C7D7D582D26262D
%A8FD1AFF4B442044204B2044204B20442076FFFFFFA8275252527D52A852
%27FF52A85227FD07FFA77D587D58CFFD2BFFA82D26262D262C042C262D58
%FD1CFF76204B204B444B204B444B204576FFFFFF7DA8FF7DA8FF7DFFFFA8
%FFA8FFFFA8FD3AFF7C51042D042626587DFD1DFF4B442045204B2045204B
%20452076FD4DFFCFFFA8A8A8FD20FF76204B444B204B444B204B444476FD
%72FF4B20204B2044204B2044204B2076FD72FF76204B444B204B444B204B
%444476FD72FF5244204B444B204B444B204B2076FDFCFFFDFCFFFDFCFFFD
%FCFFFDFCFFFD2FFFA8512CA8FD7BFFA82D588304A8FD2EFFAEFD4CFF27FF
%832C58FD2CFFAE5151A7FD4BFF2D517C04A8FD2CFF047D7D2C83FD4AFFA8
%7D58A8FD2DFF2DA8CF047DFD7BFF26587D26A7FD7BFFAE5158A8FD7EFFAE
%FD42FFFF
%%EndData
endstream
endobj
966 0 obj
<</Length 65536>>stream
-%AI12_CompressedDataxœì½ë’$Çu ùùµ?dFš-ºÂãܵ5««³CF3š•ÁŠÝ°G}ú"‰óôëçò?žÕ€@Jfè$Øíž‘™áŸŸãá_Æ_ý¿ùò³«oÿðøÙôl¸8ýÕ_ݼ{|øðöݯ.´öâóW¯>¾ÿðNª~ñÛ_^”úªú¢«Ï÷¯ü…ÿõñÝû—oßüJŸz6Ö'ïeë_üõËW¯ß_Ü~üÃÛç|üðË‹_ü²>÷»—^=Ög?üéÛǯ><|óþÙÃË_ò®u7·êÓóe™.Ëp±ÿjX.~óëúüõÛo^¼|óÍõÛþÕÅgã¸]|vež.Æi®Ïÿ§—¿}|þ¢õÙR_¶×ÿ/óøl9†½¾zz¶Í{Ýâöíó¯ß|øÍ»·Ïß¿¿yûêí»÷¿º¸ùÓÛ‹_?|SŸy¸øï¯^½ý§‹ëWÏÿ>mrÿö͇úÒ_ÿéݡuûÏ~ûøÍÇWïÒKþæññÅã‹ï~áÕçËW÷/_=ÖcõúáÃÅ!Gõêó2~uýñå«óñõëAœå»]}>}¥Ÿî÷ïëǪŸPþ-ÕÛWŸ¿®5_>~øP¿t}i™ßþõuþFµR¿ø»úÖ/µ!ëQþ¿ôݾ{ûíë‡w_·ýl9äh£üÿ¬Gn®5öºß=¾þöUm=°óPŸåÕñ/Uý>~è§Z¹,ãÅgSÝÉ:mÛÅTŽgó¼Lõ;MϦuœl›Ö -ÿøòñŸ~uñ7oß<Úá¹z÷áË—ÿ«~á}.ÏöýØ/–cy6nËjÏÿöã«Çw¿óRŽ°Vv˜~ýöÅã«Úc/÷¯ôè裴ÿ·üîáÝ7jïyûêãíÈûàOÕfø/z”n±Ø|ñíã›ß½ý¯úI?÷åÙ4-óEýŽã°×ãQ¿á¸^”e?.Žµöº]ßlÞ†‹iå틾¹:ÙŸì·ÙäOmÅßÔvýâÝËo^¾ùÕgSíèµÃ[‹ÿõ»—/ZƒoãÅnÿ§_èÙžþ;øÏ>y=><¾ñãR;ÚͯSÇžýúËú¶wo^ܼ}-íñ^ιÚcÞÔÎôêí7ö\ü[Ÿ©›üöôw§é¸ü‡o?<¾¯ûzõX¿øå7ïþññ¢ŒûåÕ‹—ïê3ï/¯ÞÕ§/ož?¾¨\x¸¼{xþñÃãåß|¨½ýñò^vºü}lñ`/yн]><ù®v•¯_=þóåC{mÿ ;ÎÎuËÓå£mú˜6}ŒM_Úî_Úk^¦×¼Œ×¼ÑÝŸ.ßÚkßÚkߦ׾׾µòÑ^úÑ^ú±½ôtù1^ûâá›oß]¾¨ðññòy=Þ—ï?<¾{%ßâýãs醗øXùùáòÛ‡wr¾ýãeÝâõÛxUÒ;=™ëÞ^\>ûmÅË7üpYOîr:_Úgˆ·{öæí‡__^Ý]~ñþÕÃû?ž¢êÛJ÷×/ß|l/âï?=¾¹|ýñ¼úôäuüýöÝ‹¯ë®^¾y”¿~xÿüã+)ð‚‡ZïïþßË—|ñöŸÞ\>þóóW¯õŸµw½|þðªn[}]Ïè—ož~Œo>ÊøòúmN¾þÐJv$*¶_~+ßüý·Ï/¯¬1®¼³ù_w—o¥¼yQ?ÒåãkýK;r=ĺS -¶O-µz«|ñò_J‰ƒÇü¿Ç¿¾~÷`-z÷ñÝ[ý¤z¦ÄçÖ’îîtùõËú…½{Ôw¾ü¶¾ÏÛÒA´Ûyö‡‡÷ñµP_úáo?¾¯]äty•ºè]ú÷•õŒ»øpwvh>·úÏswý<^ô¹½è{Ñi|ï/ì¿·Wü>ïæ÷öÔi©÷ï_^¦!^?<'ý½Ž -éÐýòù§ÞàÏÇ;ÙsÆ›ÕðîÝcÛ^‹üýº¥žÙ/ß¿n½1ÕüFÈóüÕã—ª!Çëyo·_׬&6½{ó¯Þ~›>dÔÔ!ëâ¿=¼ûöûv-ÍT‰ù¢ž!z>·Ãøöõ·’÷]|ùLJoõã~øã½¾òËÐ_=¼©8×úØ¥à§ößʳIV;]„û}Ÿ}ö=L\.®ß¤§ÿZ°\ǹ_É®ß<êg°š‹òËÓ'ê*sÇ‹ë5àþ¿Oƒü)Ã4ÌÃ2¬Ã6ÃÕp=ÜwÃ})¥ò¼,e«ÇQ®Êu¹)·å~Æ2Žã4Îã2®ã>ãÕx=ÞŒ·ãíi¼ï§aªÙñ4O5_›öéjºžn¦ÛénºŸkú\SÑš¾Íë¼ÍÇ|5_Ï7óí|7ß/ÃR–q©iв.Û²×íj¹9-·ËÝ:¬e×i]ÖuÝÖ}=Ö«õz½Yo×»õ~¶²Û¼-ÛZ“ž};êãj»Þn¶Ûín»ß‡½ècܧ}>íó¾ìë^_·K.xµ_×ÇÍ~»ßí÷GýþG9ê7:¦£~¼c9ê{Õýí‡ü¹:®ëã渻ú¸¿ªGëtUÍU=WÓUý>WõS_Wõ\Õ}_Õm®äÏu}ÜÔÇíÕ]}Ü_Ý_ú¨õº¼ø»«Óu=(×Ëõz]¿ƒ|¸k}ÛkÝǵü¹©Ûú¸»¾¿¾¿©uS[æf¼©‡ùf–Çéÿim;zëZûîÑ·Úƃ¶òTÒÒk´5}§í-->¢É·®ÑÅ‹·ùâ¾OGjyiû!µ½¶þé;šIàz¹‘°Ü×>@/˜½œ÷„»“wéSí¹K\E—ÐNÝB;…÷‰Uû„õ -é7§Ú-´c|²k,Ú5¬s\iç¸ÑÎq×:‡÷IûFí'í»v -ë·Ú%¬CÐrëÚæ7µÿ¥¶í[—ö•Öµö]»óÙÛøä<~¢ieÚùûZúÖ[ºœjc·¦Þõ¿óÓ½oñÖæ´º¶»¶|m÷“7½5þyó; -´ý
Òä¿Ö¬'€‡«“v:„q‚.!bÒNA· cÐ5è§Ú=¤ƒXG¡«´ÎK¤Ã|OZÛþ„þB;,ñоU{ªôÕ9ú«õXé³ÇÉ;í9”æ³ÎzƒÏ¬½Tú¨QHú¦ôKé•Ûtœj‡”î(Ž g½OúÞmíw¥ö¸¥öµ£ö²ÛÚ»ŠŽ+›v%éF÷µûLµÃ쵓Ülwõ#Nûrªàп¯-;ÕvÜkËÝÖ“|¬'öZÏçë«ÛzõÌÝj£Þ\ßÕ¯3Ý,µ—\ÝÜÜÜÝXÛÞßßßÝßÞßÔ3ùêþ¨g«}v¹Ÿï§ûñ¾Üw÷www·w7w×u˜8jçÚ*Ö–»¹t¼+wÃíýíÝíííM¥ÿ•ôšSåÓv»Öse®'ßx[n‡›ûún·õ=¯ë;õý·zz,uT˜êQn†J‘»J“›J•«úI÷úy×ú©çÊ:®‡ -£» -¥›ú•®êÛë¹²Ö“r®+͆ã¾vÕÛÚm¯k>êØêáXj'Ÿj‡/ÇPχ;åæM=K®Nõ¸íõèõTšë¡ë 6TþÞÕÓ‚Wõ„Ø뙹ÖC>ë9[¶¡žÉwµ)nê¹}Uf¯Í³ÖFškSU”u¨\¸«wSÛðª¶ä^Ûs:׶kó}eÌmeÍum÷Cù³V͵7ŒµOÔN8ÝWTÝÖ^r-å¨çûVy¶Ô4Õ~T¦a¼¯½ê¶öëÚÇŽÚÓ¶JÅ¥ö»©ö¿2å¾öÇÛÚ+¯ËÕ¿EÛ¶e¯k¤òÓ´¬¶«4ëé§lWiÖÓm×ÖªÖ¨§Óª•;{Ù~lÛ~²uÿÍÏÛݾÿšóö{[ødMüÓµ0çí8skÛÎõÕõ»šÉ\Ô2\”aš/OõUª¹~*VŠg£\Ÿ»¾4ŽDë‡ehã'2´Q2´92´E"%5¶³Aòv¸×üL†ÉÑc»M‡ÊÝc÷ëúoå‹z`'ƒ¦›§z$dä”±s×ãcÞExãY”7i”'#jŽôöR¼w’Oƒ>yX‚7i{-.Z(#±ŒÅ׳å*·Êãޢ“†Žò°}-,J¸¸iȸkØhÿx -îyä—è7Ú®´X,ÚôŠs]ä$8ltöØŸ"玞G7JŸÃé³iΚ]iÖóÞÛ6“Sw=ÕïayZ}»zPzd ‘¡F›Iûl>è #ÃŽ
<2ôÈàs¥Ùç®CB2-z~ÙP4ž´×:"ɘ$£’ŒK22Éؤq¥„o’Õ!J)¦fíí£>.ƒYuÐ:é¸%#׎^2~É&c˜Œb›Žd«ž}vÎO:¦ÞmÛîu|“îö¤ÃÜ͵ý¹ÒáîÐ!o×aO¾U¿EÀYÁIBæRä¡3,’ZKàs¯Ãc}h_õ}ßøãÖwñ°d“+CL±Ø4É2áâßl‰Çê-{<Žx\ŃÏâNõ¿Ûô¸‹Ç=Û!%=ÆxLé1Ÿ´ í±¤Çš[÷Ø»Çqþ8i_ñ‡Ô'4Ÿž¨›¾c^†©ºÑSïõôStÅç`òäÜ•'Ò5‰Ö™—âóq2S.§<ãò½ó-ÝŒKš[[¼M
¯NÞ`·Ö.Þräí0ÛAµÃ'ï+ìFÏ79ïîå,Ô³Q˜!§ç|ªçé¢zÀZtRG¬I"5HÉøTÇ&
,ôµ˜hÖÁFb¡kZ–J €NŠŸ+&†úaê™XãŒÍ‰¼¤ì6¹Tóó˜^5/¿©ß×BŒ–‘Ë|‘ÄA0|{’pAcËÉ7n5/·‰-ÅNFOO8)N¾rÆ´Hy¢8KA¤Òì/;cS+[[_iójãjÓZÃ.Þ¨‡7¦5dÑ&œµå¶SÅïQYs]?ëmô½„k[Iˆs¿Ú7=)ßìS$ý,=u0½¦TßSÃ3´¹Ìlz®f·)$#›|²ŽéºíäAá³v>o—;°ž„9¤ZÈë;îœ07š©\ë¹}¥çø¡Y‹>Nž¾XA 1k01i@¡!…=dŠNƒ‹;Ÿš¸UÛˆrE¸±k³錟³¢hÒA»† !ˆ%A·ŠH0r³dפHÓ¢“gF‘ÉC£”§\{žd™’Å,–/YN¬‘‹'Mw'Í›,sºò×ÒÓ§so2ÎëCGüáúì±ûãÐÿ·i¹ú8é_s÷`Ïfòòü^ù©¦ÿŒ?ÿ{vh¼¶Œ«]‰ž%Ó:4À¸ÑéÈQÃ:AŸ¤RrVßi5iÒdés‘:'~ªç\û²©p;¿f’”læJ§%¹ä5ëÔ¤ôGGïtzÒÆPFÐë“ÌSž
žŒœ:j¦1“ñ2FK¿J!gçâ#¥“2R2J¶1ÒFH»kOçäLì<9<'> ÎÞÌÏâNúË -_V8¦E…ƒõ¾’°Žÿ'
n<,¸ö¶dõë¡1„]£[5²˜µ…íaë`ƈD$*©Éæ`Øb9Ì/‡¹ópÆÅø(ÏׄOÆÉ~½>{¤Ñ÷¤–úÇùŸ~l¿ïGþ³¨ <
Æ>®Ð5QýcyòHË)þ¹=yìùaK¿{Ùáw,:L8nº‹û‰ž|úúlÉa -GçXFq‘~ÇjC¥>¥‹öyÚ÷,¦è–¢µÅh¶¾ðæ”–X•fëÒVï(Ú!ôøÄòþ¼ÀÿJÇÖ›65í«ûóâ±óUý¾xìäSÕ?hõØw®öh.ÊICïZðáK>b2[¯g¤ í¼îÃW~œ|ñG7«×ºÛĶNmŸE?rÀý Çnâ‰}DÒ‡?n?ßEü9¿jÐ~gÇï£F¿yûêï.nß~à7@jÌñ´îb|VÆå¢<Ûš ÊEq)nr]z]êWü¨ÓWßêüCñ_ùÛ?iñ?×þÏZùOóů/þî/´þo[ÿò=±ã×µª«ÿ5þnZÓ€\•·{£ïóÅXð·ÿÖŸñk?zG/ÿôœ¾ýZžmò‰ëÆëR?Ük¯;¤fÙK¹ÐWÚ,˸ÎZž×UÊóZ»ÛsÛb=|=Ã:NòY¼¬¯Ý¦îKßeš6YêÑ’*YÖ,/™÷q–r=ƒVÝd²öáíâƶ™d{©+¶I
R¤X?Q±]ÔS®–åCø»Ý¤jÙ¦Q_2¯»–e¡„–í]êâËÔPh•ºš¼ìúšJ9)×fÖ/·”Aߦ+{€¡žÚëQþ´ÚAÛ')WHlR>ä'ky™7ŸÚª“ÕMG¥G-O5–ºX÷ú—UÊË2mZ.›l“¾bßyAÝÙÁ0Êñ˜êZ7-×Qζ˜êá]©+è¯ -Ô0K¿â!ãž³žÐ{íûV^´¼Õpƒm¬ÅêW¬¹¾f·CR75ö웂ÚEœ’ûhU
Kô%5¨Ðò4Z^ÖÝ€V{¯ls_ÿ[æz,=è¤nœ‚tR,c#]-5qëH'u£}bíÐK=Ö‘NÊe^3éjÕ¾ÎtR.K#”§¥'Ý"§å¤“—ŒK#–‡Žtº×‘®–
ÛN:-/=é¤N“NÊÇØH'ûœ§žtòç¡‘NZi¤«åÑɤ«uºtµ¼ÎS#Ý"'åÚ‘nY*PfH·È¯½tµ<GOºZ·G#]-ïãÖH·Ôèk(éjÕ(? éj¹¶#<¿=éjݤ„wÒÕò²tµ¼KOºZ·KnÙž
õxC:)n¥'Ôík#–kuµ\äËfÔIà -ÔÕ²\÷ ÔIyzÔÉ6ÇÐP—ö!¨“â´ô¨“º25Ôék¶†:-¯=ê´nj¨“ò26ÔÉ׫§`‡:9ÛÞP§íY꤇ìSºÚ‘]Wi¨«E™x Ôi¿+=ê¤on¥¡®–kÜÑPW˺mFôqÙÔ)[¶†:-ï=ê´îh¨Óófj¨S
ê„5ÇÑP§å½¡NÊûñu5Ϙ§£#T-먓ruR.SéPWë¦u˜uR†=PWË£…ë®Ö”cÛƒtR®í¤“òºéæÈɳË1ä´l
ÈiU™rR.(…œ”{ƒ€œd]ÇQrò‹î”qRÜ,"ÆÉ7Û¦#§GkÞƒqµ¼J•WëöÁê”qµ|Ô*7ËÙX»vb\š‰ßrµ¸X•qµ¸BãjÝQ³÷`ܼ?½(WËÓ4/äjÝâq–B®–õØ -é¤ìçNnÓC7éäDí„RÒm’· ƒt›æSn×¼µ‘n×¼uìH'sü»ÅFJº]òÖaÒíš·vA]ÅSí¤+¨;4q-:™ª?kºC×}
Ôš¸.
uÓ̵Vu™k-w™«<ž¹–¡Ï\ËÐg®µü$s-C—¹–Òe®R<Ï\¥.g®ZN™k)O3W©Ë™k-w™«”Ï3WÙ&g®iʺò4s-¥Ï\õ5)sÕòYæªu)s•rÎ\Kyš¹–¡Ï\¥=å«ÃºãiâºkÞZ@LÀ¯FGEÝþ4oÝ%-GN§Ë)H·ë–sG:ÛFÙ”t»¦cnš¶J9§€NΚilÝ®Yë˜A·kÖÚ"º]³Ö)@·kÖ:?¬õÔUx™tƒæs›¤$Ú¶-X7Hæ:ì}\§?s´·ÜuÔUÓnÜu0¬‚;Ç6®wƒ¦¯@Þ ùëñ`'=¾vÏ´4ŽŒ;©+rúÁ»ÁŽh à
Ò -»1ˆ7ØAlÈ“~9¬÷*óÉc·¥ÏdMd`J½A3Ùqì
šÊ–µãÞ ¹¬ìðÉ×UâFŒ§Ùléb<Éfç _é²YY^4YzÜB<If§Æ½Q“Ù¹e³’ÌÎ[ŸÍJ2kl´lVQiÙ¬$³ËY6+ÉlŠñFï×–ÍNšÌ–~ÊN“Yòdš³ö#?J:g'ɬ
RmÎN“ÙÒæì$™]–6g'¹Ñ´ösv’ˆZ²9;Ifž6g'ɬ•Ûœ&³S›³ÓücŒ9;Mfç~ÎN’ÙmisvÀƒ9;Mf§~ήOf'Íe[2;=Íe'Me÷„L˸µ¯ÆZŒ×å²ÛaÚ‚{Òí–áØ;òI眎Š¾A“Ùq
ö
šÍÚ<`ÀON·ŠÌA?9Ê<¬?á.P*E‰f +
endstream
endobj
1370 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
1308 0 obj
<</Intent 1371 0 R/Name(Guides For Artboard)/Type/OCG/Usage 1372 0 R>>
endobj
1309 0 obj
<</Intent 1373 0 R/Name(Base)/Type/OCG/Usage 1374 0 R>>
endobj
1310 0 obj
<</Intent 1375 0 R/Name(Class)/Type/OCG/Usage 1376 0 R>>
endobj
1311 0 obj
<</Intent 1377 0 R/Name(Trait)/Type/OCG/Usage 1378 0 R>>
endobj
1312 0 obj
<</Intent 1379 0 R/Name(Package)/Type/OCG/Usage 1380 0 R>>
endobj
1313 0 obj
<</Intent 1381 0 R/Name(Object)/Type/OCG/Usage 1382 0 R>>
endobj
1381 0 obj
[/View/Design]
endobj
1382 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1379 0 obj
[/View/Design]
endobj
1380 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1377 0 obj
[/View/Design]
endobj
1378 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1375 0 obj
[/View/Design]
endobj
1376 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1373 0 obj
[/View/Design]
endobj
1374 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1371 0 obj
[/View/Design]
endobj
1372 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>
endobj
1307 0 obj
<</BaseFont/JEFNSX+MyriadPro-Regular/Encoding/WinAnsiEncoding/FirstChar 49/FontDescriptor 1383 0 R/LastChar 102/Subtype/Type1/Type/Font/Widths[513 513 0 513 513 513 0 513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 448 564 501 292]>>
endobj
1383 0 obj
<</Ascent 952/CapHeight 674/CharSet(/one/two/four/five/six/eight/c/d/e/f)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 1384 0 R/FontName/JEFNSX+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>>
endobj
1384 0 obj
<</Filter/FlateDecode/Length 1244/Subtype/Type1C>>stream
+H‰|SmPWÝ%ìF*MÛÄe4¡»«µ#"b(‚¢8 +6cˆ3~u &jÑ’v¦ !:T,~à h2UÛ‚+h‘ÅÔ¢‚2ѱTíön|™i7ôOõÏ™{î™{Î}oÞñà ÇñYiéÕyKsö9Ne4,Û¤ßU^¢5D†Wàüü`><”B+ãåË—Ùô½·ßè ~&Å‚püÞãTC™0»k·™]‘˜@å,&D³q±±±³¨d×ë…zV½ßdÖï5±™¥Ec™Á¨5ëu1ìú’vÖÂÄõ&½±"Ðüw#–3±zμ[odµ‚¸‹æzk6juú½Zc1k(ÿ¡;ÿ'ŠåJYÁ‹Õ”r¦6M«-Õ-\³)E†òR³‘Ó›b–§«s÷—éÙU¬N¿ÃpLŠcT¶ + ®«¥=U“¨xsëÑ2¦<ƒ¨<×W9¢€…/ž‚lL{=¯i+*hÌS˜Ú¬˜6XM€”X† wbFñ¯'á¤àôERUå¶Ï÷1‰§îÑlž“µa[š'GÉÓÂÇ BAšô‰Ss9m m% +÷6ÂQŠ| WZœ' $ZFt|ò0”TJ]^83)sóK|ºd»Ê.¤(PHDŠ·3hÉt$„Üë½Øsšv²u Ä]ÒzÞê¾,çÇÅJuÐV}¨š–¹³ª4E*Ų‚±ßÿì¹?ýS×ÖÜfÆa±°È%X†aM?,êÇ]Á9!â¡‚ªm´7“{F+ÑÂxD¢á„¨Ñž–ÃtU?q°XgÉVÄ¥¸a®•±÷S7\cÏN)smŒ„>Bü $àã“"Hãã!d…œßùjàÎé–Ï>m¦›†ˆ†÷5+ +·T¼‡)ÒUå¼'7gdúã…Çéô½Ó„¶9a¹Óíô›H>«e×û
ÎïêÏÔ‹éã;Ò>9üwhÈà+Ss§êB_åçñoQÿ0 +%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 13.0
%%AI8_CreatorVersion: 15.0.0
%%For: (donna) ()
%%Title: (type_tags.ai)
%%CreationDate: 4/4/11 7:44 PM
%%Canvassize: 16383
%%BoundingBox: -227 -63 143 234
%%HiResBoundingBox: -226.5 -62.001 142.5898 233.748
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 9.0
%AI12_BuildNumber: 399
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_TemplateBox: 40.5 29.5 40.5 29.5
%AI3_TileBox: -239.5552 -349.6377 319.4453 433.3623
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 6
%AI9_OpenToView: -239.25 83.5 4 1355 732 18 0 0 43 154 0 0 1 1 1 0 1
%AI5_OpenViewLayers: 777777
%%PageOrigin:-399 227
%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
1387 0 obj
<</Length 7484>>stream
+%%BoundingBox: -227 -63 143 234
%%HiResBoundingBox: -226.5 -62.001 142.5898 233.748
%AI7_Thumbnail: 128 104 8
%%BeginData: 7336 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FD0AFFA8282F53FD7CFF06A8FF5359FD7AFFA92EA8FF537EFD7BFF
%53282E28A8FD27FF2E2828A8FD51FF847EAFFD27FF5953AFA928FD7BFF59
%2EFFA82FA8FD7AFF847E7E2E59FD7CFFA87D7DFDFCFFFDFCFFFD31FFA9FF
%FFFFA9FFFFFFA9FD76FFA9FFA9AFA9FFA9AFA9FFA9AFA9FD1AFFA87E537E
%A8FD2BFFA8A9A8AFA8FD23FFA9A9A8A9A8A9A8A9A8A9A8A9A8AFFD17FFA9
%7E282F282F282F2F7EA8FD26FFA8532F282F282F53A8FD22FFA9AFA9AFA9
%AFA9AFA9AFA9AFA9FD16FF7E2E0128062F292F072F062F7EFD23FFA85906
%06062F282F0629062F84FD1FFFA8A9A8A9A8A9A8A9A8A9A8A984FD16FF84
%28062F282F292F29302F30292FA8FD21FFA8530629282F2F2F29302F2F29
%2F84FD1FFFA9AFA9FFA9AFA9FFA9AFA9AFA9FD09FFA8A87DFF7DFFA8FD04
%FFA8280529282907532F53292F292F072FA8FD1FFFA92E00280629062F29
%2F292F292F072FA8FD1DFFA8A9A8A9A8A9A8A9A8A9A8A9A8FD04FFA87DFF
%7DFFA852275227277D27A8FFFFFF530628062F5AA9FD04FF7E302F300753
%FD1FFF7E05282FA984A82F7EA8A9845A2F302953FD1EFFA8AFA9AFA9AFA9
%AFA9AFA9A9A9FFFFFF52FF5227527D7D52527D527DF8A8FFFFA800280628
%7DFD07FF7E2F292F06A8FD1DFFA905280653FFFFFFA9FD05FF7E292F0684
%FD1CFFA8A9A8A9A8A9A8A9A8A9A8A9A8AFFFFFA8527D7D27A8FD05527DFF
%7DA8FFFF5328282959FD04FFA9FD04FF7E302F2F59FD1DFF7D28282853FD
%0AFF5A292F53FD1DFFA9FFA9AFA9FFA9AFA9FFA9AFA9FD09FFA8FFA8FD06
%FFA82E002806A9FFFFFF7E067EFD04FF292F292FA8FD1CFF5300280653FD
%04FF595AA9FFFFFF7E2F292FA8FD1BFFA9A9A8A9A8A9A8A9A8A9A8A9A8AF
%FD13FF2828062FFD04FF2F2F29FD04FF542F2F28FD1DFF2E28062953FFFF
%FFA82F067EFFFFFFA92F2F28FD1DFFA9AFA9AFA9AFA9AFA9AFA9AFA9FD12
%FFA828052828FFFFFFA82F072FA8FFFFFF2F2F2829A8FD1BFF8428052806
%59FFFFFF8406292FFFFFFF842F2929A8FD1BFFA8A9A8A9A8A9A8A9A8A9A8
%A984FD14FF2828062FFD04FF2F292FFD04FF54292F28FD1DFF5328062953
%FFFFFFA82F075AFFFFFFAF292F28FD1DFFA9FFA9FFA9FFA9FFA9FFA9FD15
%FF53002806A8FFFFFFA82984FFFFFFA8062F0653A8FD1CFF7D00280659FD
%04FF532FA8FFFFFF7E29062FA8FD1BFFFD04532E5353532E535353287EFD
%13FF7D2828282FFD09FF532F28297DFD1DFF7E28062853FD0AFF53062953
%FD1CFF5300280006002800060028000053FD13FFA92828050653FD07FF53
%29282828FD1FFF28280053FD09FF7E062806A8FD1CFF2E05002800060028
%000600280053FD14FFA8052806282E7E84AFA87E292F282F06A8FD1FFFA8
%062853FFFFFFA8A9FFFFA87E282F067DFD1DFF5300280628052806280528
%060653FD15FF7D0028052806280628062806280059FD21FF7D0053FFFFFF
%7E062F28280628012EA8FD1DFF2E05002800060028000600280053FD04FF
%A8FFFFFFA8FFFFA8A8FFA8FD07FF7E06280528282806282828057EFD23FF
%5952FFFFFF7E28062828280053A8FD1EFF53002805280628052806280506
%53FFFFFF7D52FF7D52A852A852A8527DFF7D7DFD04FFA9A8282800060006
%002828A8FD24FFA8A8A9FFFF8400060006287DA8FD1FFF28060006002800
%06002800060059FFFFFFA852A8277DFF7D527DA8527D7D27A8FD07FFA87E
%597D537EA8FD2BFFA8282E7D7DFD22FF5300280528062805280628050653
%FFFFFFA87DA852527D52FF527DA852527D27FD3AFFA8FD25FF2E06000600
%280006002800060059FD04FF7DFFFFA8527D7D7DA87D7DFF7DA8FD60FF53
%00280628052806280528060653FD72FF2E05002800060028000600280053
%FD72FF5300280628052806280528060653FD72FF28000006000500060005
%00060053FD72FF7E2E532E5352532E5352532E537DFDFCFFFDFCFFFDFCFF
%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD9AFFCACAA8CACACA
%A8CACACAA8CAA8FD74FFFD0DCAFD18FFA8A859595883A8FD53FFCACAA8CA
%CACAA8CACACAA8CACACAFD17FF7D2E0B2E0B2E0B3434A8FD52FFFD0DCAFD
%15FFA82D0B052E0B340B340B340B59A8FD29FFA8845959535959A8FD1EFF
%A8CAA8CAA8CAA8CAA8CAA8CAA1FD05FFA8FFA8FD0DFFAE2D2D2D342E3434
%34123434340B59FD28FF7D2F0C2F2F352F352F5AA8FD1DFFCACACACBCACA
%CACBFD05CAFFFFFFFD047DFD0DFF2D0B0B2E0B0C0BFD07340B59FD25FFA9
%2E2E0C2F0C352F352F352F357DFD1BFFA8CACACAA8CACACAA8CACACAA8FD
%04FFFD04527D7D7D275252A85252A8FFFF590B0B2E0B345FAFFD04FFFD04
%340BA8FD24FF2E2E2E35358484FF5A36355A35357EFD1BFFFD0DCAFFFFFF
%52A8522752FF525227A8A82752FFFFA82D052D0B2E84FD06FF340B34120C
%2EFD23FF522E2E2F0CA9FFFFFF5A2F3635362F3584FD19FFCACAA8CAA8CA
%A8CAA8CAA8CAA8CAFFFFFFA8A8FFA8A87DFF7DA852A87D7DFFFF84052E0B
%2E83FD05FFAFAFFD04340C34AEFD21FF842E2E2F2F5AA9FFFFFF5A5A355A
%365A2F5AFD1AFFCACBCACACACBCACACACBCACACAFD12FF5805052D2DFD04
%FF830B342E340C3434340BA8FD21FF59052E2E35A8FD06FF5A2F5A35352E
%A8FD18FFCACAA8CACACAA8CACACAA8CACACAFD12FF7D052D0B59FFFFFFAF
%0C340BFD073459FD21FF2E2E2E3535FD07FF5A35355A353559FD19FFFD0D
%CAFD12FF5205050B34FFFFFF84340B340B340B340B340B59FD20FFA82E06
%2E0C3584FD04FFAF845A2F352F360D59FD18FFCAFFCACACAFFCACACAFFCA
%CACAFD13FF7D052D0B59FD04FF34340BFD05342E2E83FD20FFA9282E2E35
%2F35A8FFFFFF5935355A355A353559FD18FFA176A176A176A176A176A176
%9AA1FD12FF7D2D050B0BFD05FF595F59340C340B2E0BAFFD20FF842E062E
%2E352FA9FFFFFF5A2F352F352F352E59FD18FF4BFD042044202020442020
%2076FD13FF2D2D0B0B59FD07FF2E342E340B59FD22FF062E2E2F2F36A8FF
%FFFF59352F5A35362F2F59FD18FF76204B444B204B444B204B444476FD13
%FF7D042D050B59FD06FF340B2E0B0B7DFD21FFA82E052E0C2F2EAFFFFFFF
%5A0D352F352F2F0684FD18FF4B44204B2044204B2044204B2076FD13FFAF
%58052D052D2E8484A884832E342D0B58FD23FF7DFD042E35A8FFFFFFAFAF
%35352F352E59AFFD18FF76204B444B444B444B444B444476FD07FFA8FD0C
%FF842E042D052D050B050B052D050B2EFD24FFAF282E062E0684FD05FF59
%0C352E2E59FD19FF4B44204B2044204B2044204B2076FFFFFF7D7DFF52A8
%7D52FF7D52A852FF527DFFFFFFA858050B052D0B2D052E050B52FD26FFA8
%05FD042EAFFD04FF592F2E2E53FD1AFF76204B204B444B204B444B204476
%FFFFFF52A87D52A8FF52A8277DA87DA85252FD04FFA87D2D0B0405040505
%2E7DFD28FF7D052E062E06597D84592F060C2EA9FD1AFF4B442044204B20
%44204B20442076FFFFFFA8275252527D52A85227FF52A85227FD07FF847D
%597D59AFFD2BFFA82E2E062E062E062E062E59FD1CFF76204B444B444B44
%4B444B444476FFFFFF7DA8FF7DA8FF7DFFFFA8FFA8FFFFA8FD3AFF592E05
%2E062E065984FD1DFF4B442044204B2044204B20442076FD4FFFA8A8A8FD
%20FF76204B444B204B444B204B444476FD72FF4B44204B2044204B204420
%4B2076FD72FF76204B444B204B444B204B444476FD72FF5244204B444B20
%4B444B204B2076FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD2FFFA82E0BA8FD
%7BFFA82D58830BA8FD2EFFAFFD4CFF2DFF830B59FD2CFFAF353584FD4BFF
%2E2E5905A8FD2CFF067E840D84FD4AFFA87D59A8FD2DFF2FA8AF0C84FD7B
%FF0C59840C84FD7BFFAF3559A8FD7EFFAFFD42FFFF
%%EndData
endstream
endobj
1388 0 obj
<</Length 65536>>stream
+%AI12_CompressedDataxœì½ë’Éu ùùµ?dFš-QáqîÚ˜ÕUÃYQ¤±ÉÍÊÆÚŠ@u# +±ÖWõ8~ýîùÇøºRïÍãÛ§zÆøêckÙž¨~ý|óß<¼|¼¼²Î¸òÁæÝ]>Éy÷ª~¤ËÇ·ú—事u£4l›ÚjËmá«×¿-$vZìóÿÿúêýƒõèݧ÷OúIõH‰Ï-ÝÜéò«×õûð¨ï|ùM}Ÿ§W2@´¯ÛqöÛ‡ñµQ_úñwOŸ>Ô!rº¼JCô.ýûÊFÆ]|¸;Û5?³å?ËÃõgñ¢ŸÙ‹~a/úEÚßûöŠßØ+~“7ó{ê•ôT=I_¦µ#Þ>¼|/ã½r__öðR;¤íˆ>]þîÓ»¯ÞzûæáÓÇzÖSÃ?\¾|¨ë~}§,]þÓ—¿þPO í¼1}©˜º{÷òINò?½øòÙYõ3çÙ¿¿|þ²Ëç+ÌýÿÚU6ò6ýºF0§¿/kñcü¢lÓeÝWÿøéáMm¬—¯ß}U•HG ì}Ah
xêΗƩìEÄ +‚¯Þ¼zýÕW—õ‹¾ÕÓòå7ïŸ^}zY1ñºnñ£ +ÜáæþæîæöæææºÂà¸Ùëð^ë±3ßL7c=Û×÷×w×·×7õ3]ÕO¶×Ï·ÖO9×Ï:^—ÓõPOwõãLäŒrÔ¯³Õ/µÔ¯6Õ/X®†:`ïêð½©_úª~õ½î€µŽø¹Žþ± C=.îê"§À+ÙS{=€ÖºÛæz\õøê±vW¹›zô]Õcd¯»·îñº›çº³ÇºË‡J㻺ûoj'\Õ®ØëÓkí–yNõ¨/ë°Ü×Þº}v]{î¨ý·Õ^\j_NµGË2Ì÷u§ÝVª\×¾>joµß—Êœ©†e¦û +£»Š¤›SeÓU%{+k3s9c¥Ø0Þ×±t[GÔu=:¾¶J¼¥Ž¶é_×—ŸíÉÛýôÃöäõpŠžüúQºñô½úñ{õ¢uâééÅÚ‡táéû÷a=‹•q(÷ÿ›ôåyož¾çQù½{óô“Ñ›§?刴ެ}9_üÕ—×ïkr"E¨e¸(à K¾8ýÕ—iÉõ‡S±V<íú\¥5i‰Ï÷˘ÆÏdL£dLsdLrž#?"»©';Nwr›ô„G$&§="ëC#„kÏœêÐ;•ûˆËä\(gC9Jt&ñÚ•î³Ó<êÖÿîõl)Q›Ämõ¬yÒàm®;~Õ(Aœ„qÈ]i0'áÜö•üÿ²ô^Ò‹³žÜåÈg9i~&áÞìÿ¿¤Çª!à¦a ýÿ®á¡Aá•ÿÿ•ž°¯5³»>Å?ëC_L»nkÕ!µø»MúÞ:¸ä¡Ó7þ¸ŠÇîú•Oõ›/>ðì잺›|·Éã&WñØõ!»|Õ‡
ÍIòÚIûÇÒgõQ»O»ÑWñØÓ#b]³©”S‰?2nâq›áº{\é˜ã±?NŒùCwªBhQÍ’$^—`‚?>WAØ#ÜQêH$ +‚á¤aý¦,wš¶Xêr£ÌÐò§½‹æ6-ÒZ®[<£™4Â5ˆªCÿäé%8r\kØq¥e@Kv,ݱ”Ç’žQK‡zÀh@bé„%×'Ï‚,²LÈr¡)E)–ÝúÙãZwå¡rÓ½¼x\÷ýIc‹^,OºõèV" ÿo:{ŒÝcèšRÜ=
Oú×µçößU<d)Ù‰=rܸwÍ*w'/ßNî^Ö£¸·¤R_‹3û·ÖzúŽJkþÜJþïö¶éߧ®Ðèÿ2Þ*%ëvI®%¼FR%ÉÔáé“”…~VZ4ôÝzm±Bï¤Çœ—³õèšj/oÚçVƾӪ]xÚ£Z}ç¥ÆY‹»–o멳œê æ2ƒœ4ë S;UÊQv¥§H;=NZ€Üô +²Ïíáô¹XÛNä$S$RG¤PK$OÀw^â{Vä;}kÏ+}Ÿ)ô}g©ïäµ¾ï¬Ü~G©ïY±ïôýj·ß¿Øwú\µ¯+Õ½½âð¢cöy–Tã©ÿX÷±ž&eöò2ƒ<uåXËÅx^çû6wýA6nó±Õg•ÂKýGÝÒº–¼©£"·Û´VTÿ1mu‘ljž^Ó~±•SÝùíþ°›ÕO:Û¢ßp\ö¢3¼ëYkÚó7ÿ¦òÕG™ü=Úwׯ<Õåu,å½øÃlP?Ý:ó®ëîÃ2É7ê+·)omâ{n²Ùì6/Ú!ã P/Rÿ@ÛûSŠ½¿ªÿzxÓOy¾ì¢üezÌ_¦ÇüezÌ_¦ÇüezÌ_¦Ç|çÿ2=æ/Ócþ2=æÙ)™óï§/ÿ·›ó]Ó_þØÔ™qÆ4~&cûŒéúÙƒ¢ôu*S÷íÏ?§S*[QñÎíÏ=wý--ßàùg:ßìg +U»4;ùɹH.&'è—fõZú•Ÿ©Û$3fêT3?kG,çn‹Å-âl2×põÙg]E|˜§m°êkå°1ëg¯»¢+S×<Š†ë?ê‡)e·òk*–þ³jøR³VyÑzZµ>ʼVt-«nð–}—÷šëÙHß«¦´Ç(5áy}1¬ÛÜ×ê¸Mþ)‘ÉoÞ½{xûøêâkÂ}±Éç–vÑÉwžÉŸ={ô…}(q}|[û[bšÓgâ‘ÏÅSß7¥WœÎöÊ_E¯DLˆÄ%ÃSDå‡Ð£ÄôÐ+Ÿ*U¥I™q·ÝœÒÔP9ì·aK|½úq-G4¡õóAåØe6赨'=JW?B‰¨í˜´i Sšz«ôµ†Ò6Ùj²¤Èg|^—ãäStŸš[ê@´É¶ëmÎÄæ“
œýÆöQÙ.tïgk^Å<Í6KSâ +fÙeF?$ÕŽ¸Tº9öXfϞƳ™CmÖÐOüòI˜:7`õy˜ÌÁœbîå`³.õ”vë«‚Xe]¢±]ûœk–µïOÚý³ÿÿä!UðŠ†zð
ÿ»G?ô…:~<Tè#ˆgñE}\Ÿ=RÔrÒlýãüOÝ÷ÓY4Už‡[cé$¹þ±<{¤HïÿÜž=öü°©ªß>õ[&£v—¤ò4½"qÒBõ³©¨i"êìIÉžfÜ|~ªÎA=¥d#Ͻ9Ÿ—˜g&湉mv¢Í;½9¥I§%¦)ÚDÅÕŠÝ?zÙ©£)Mç¸5Ãõ6›péfâf¨‰q£áÐ÷˜Nøó~îÚ¼Ÿ“†hß6õÇ'ÿÄE)¿„óò ŸtòëLb*Ðuš$Ãâî,úúA‚’<Ê! +ûW‡s}öƒl¯?åç)Ú/3ùO™Ôhí—Ooþááâöé#?oRcµçË.Æe\.Ê‹ýXg!ÍMf!¬Ký¦Ÿ´ÌuõÖ³ŠÿNÑßýA›ÿ©þó¿×…ÿt1_üüâïÿÛpñJ—ÿݯê_¾%6ü¶.êßêob‰¿›.é?@^”×{§ïó‹ý¬¿{øÿû£~å;qðØ>Ô·þÃúÑÖòbÛäMÊ‹µÆYúÙdÙ!K–½”}Å¡=·Œë¬m™ÇSÛó:/mõð©/ë8ÉkÖÊ(}Í0è:u[ú.Ó´°ÊR)Y4ʨíygi×CnÕUië0ß.nl)¤é²b«õ©M¦¼¬Å6Q•MŽ•‰w4Ê¢E~ÜQÚóºk»3Ö¶w©[ˆ/3Oã*Ëj<ºëk*"¥]û]¿ÜR}›zNÚc•ëQ{fZm§í“´+G6iò뙵½Ì›¿OíñÉ–MÇQ×_Le¨_c¯ßxY¥½È$i—U¶I_±o‹¼à˜äQÙSý@ë¦ízŠ´5¦º{×C–•aÔ×#ô5síÕÚ^ëþ§ûl²Ÿë”eˆò’íXô»ÍuKûXVÝÄRp[g~!s{õûNòæõ,5êk6³Œú|™&Ö©ëë¢ÉËK¶¡h{߬YÏ…º—¥ç|m™´7˲èV·Y;s,•ŒÒ”ï*íze•]~ÇS:S"iÐ¥ÃÙµ½nÚ®£®³lºŽ\v½HÛ¨g4m>ì¶iŽOVc=Vkfd¯™õ55¯²·ê·ã·±Î>zÔ~·Vì@›ë Ò¯3.EÍuˆ=0ÍKÝN+³¼OíÎú}¤]ÏS‡‰žî¥}åƒfÙ}Í\tÔÔììÐMŒÒEõï¡pµ]C‹±
Í]ߦ~ñI^Sê9RÚöêatÈŒ2i—}åKËòq9Aê!0ë½×±oíEÛ[UXÇz¬~ÅèkvÛ%uUcϾÙ.¨CÄ )¦.ª1¾¤F$Úž†CÛ˺Ðêè•uîëË\€¥,§ 4ËØHWÛC͉;ÒɲÑ>±è¥rz†tÒ.óšIWíëÜH'í²4ÒI{ZzÒ-rX®A:yɸ4Òi{èH§[ÝéjÛ°í¤ÓöÒ“N–é¾sÒIûéd›óÔ“N¾à<4ÒéN+tµ=:ù‚tuY…n#]m×ÒH·ÈA¹v¤[– +”Ò-òÃÁC#]mÏãÑ“®.[‡£‘®¶÷qk¤[Vý‰èLººh”_™†tµ]û¿‘NžßžtuÙ¤„wÒÕö²tµ½KOººl?– ݲ½êþ†tÒÜJO:Y¶¯tÚ–ßÏvÔÕv‘/›Q'ËW ®¶åc NÚÃУNÖ9††º´
A4§¥G,+SC¾fk¨ÓöÚ£N—M
uÒ^Ɔ:ùzõìP';rÛê´?KCŒ}êQWÒ¡Sp
uµ)5@Ž»Ò£NÆæVêj»Æ
uµëfÔÉ—õA²ek¨ÓöÞ£N—
uzÜL
uÊ¢¡C°æ8ê´½7ÔI{?ž£®&&ótt¤“E˺ê¤]Ï:i—©t¨«Ë¦u˜uÒ†=PWÛ£Eô®.)’¢@:i×þ
ÒI{ÝŽtó +ääÙårÚ¶ätQ™rÒ.(…œ´{ƒ€œ¤iÇQrò‹î”qÒÜ,"ÆÉ7Û¦#§{kÞƒqµ½Jš•W—íƒ-SÆÕöQOTÁ¸YŽÆ:´ãê¢éøÍ W›«UW›5;ÆÕeGMýƒqó^wè°ãj{šæ¥ƒ\]¶xœ¥«mÝ7@®¶×q\;ÈÕe›³S!WÛõܾäfùŒûÞA®.ǽQ®¶ëª”«ÍzÚØ;ÊɲÑ裔“v±¡”“¶|ÝL9YVä Ü,?Uo‘–RNÚÓ´u”“e£ÅJ¹´
¡œ4WxPNßÚr ¥œ´7ƒ©RÎÖÙ:Êé2=”rú6v)ådeí('{²Ôñ +Ômš¸.ê¶.qÝ$o5l)é6Í[K&lTHé6¡¶'²B:iû±¤Ût×MA:9ÐG; ”t›äF ݦyë¤Û5om¤Û5o;ÒI·ØHI·KÞ:lAº]óÖ.¨«xªƒtu‡&®%P'¥úð¨;$qÝ×@Ý¡‰ëÒP7<Ë\ë¢.sí.s•çÏ3×2ô™kú̵Ï3×2t™k)]æ*ÍóÌU–åÌUÛ)s-åyæ*ËræZÛ]æ*íóÌUÖÉ™kÚ†²®<Ï\Ké3W}MÊ\µ}–¹ê²”¹J;g®¥<Ï\eGæÌUúS¾:¬;ž'®»æÔI~5:*êöçyë.ñh9‚tZ.?¦ Ý®kÎéäÜ6ZȦ¤Û5mƒtûó´U‘s +è䨙ÆÑíšµŽt»f-¢Û5kt»fó3ÐÉäP¡—I7hÞ:·"Ý qжmÁºA2×aïãºAR׽它¤®º{œvƒä®ƒaÜ <¶qm¼4}5 šÖ6 ->w -^^½ûpûRïoûðîO¿ªU¿Ðºö¡_^\~ùAnãzñ‹ëë«çÏ?¾þíÛzÛÒ_^üŸòÂÿ7½BïÞ§÷ü”û÷ÉýSýEWßù¢Ïoí%ÿWý¯þï÷'VŠ—¶R¼þC–†¯¿øåÅßþ·£¿8}r]ôÙBs9KÏf&¥*ÏLꉼ¦uÒÇÓ™I¡Ò:¤uÒr kHë¤ó™IÅÅ––Iý̤”Ïg&í´;6ËžVHOf&µ*ÍL*³Ò̤2îlfR8§c++¤nfRŠç3“òÍò̤43©;›™”×æ™Éúw73)<:›™Tµ™Iùž‰årÎg&åHå™I!Iž™Ô¶8›™”&Î3“ÚÄifRϧ³™I9éòÌäVú™I9ãÏg&139)&*Ì#ŠöœÏLJ]ž™T>¥™IEØṲ̀Ôí¥E±‚½<3)åó™I©Ë3“º1¢X)žÏLê[o-Š•rž™´mú™IK0×·I3“rDÎi®ìL3“²¿<3)_ëlfRŽF¢¹¼<3©ïlfR;gš™”rž™”6;Ÿ™Ô¶N3“Ú_JZ"}<™Ôº©Q<aÆ–HOf&VifRËifRÊyfòÁ¯Z‚ÿPzËÒ‘E»D /ZGø@"ÒâóÚ…íЧø\C1èË:ÏK -Ðk×)vÁ¬èã2Í¥]`+l슓è5úì²wÐësÚ‚§’*Î)N=eÉqú8l¶
aúzø)O˜¾.ÃÙĄ࢞œKÓw÷#L¯§‚å)JŸêøµí)J_†á°‹'Déëæó9J_6‹}m¶&çÊÆ£WN÷󰫤},ªõ(}/‡Q<GéÇa3¥Å&^ ÒÁG«¤¯Å†eÑùɆ£ëäØYŒî“/„è벧«ê5gœmj7‡èûla¼‡è3S·¢¯Ã1Ÿ‡è,x DW̶]¿j¡/Ó¶¦ -NDÔµ8v²iD.éQ¸FÔR7»ÃaþiDØZ.sc€5˜¨|Ûµ”K75¢mSRK„‚„ÔúËÐ4¤–rí{Ì -»?-MC4N•“f9Fe‰ï²Fe-ò8÷Ûú‰Që<”À¨ÄÇÛÜsTNÔ4ŽÊнO£²ÍÊ£rÚsƒ©èÛGc©ÍGm,•ºak,¢¥¢oïcÏRÑ·í7– -K–©ÁTôíµô0-LåÍcƒieÈbõ
¦5D˜ÝW˜Š¾½SÕ·µƒ©úÛë0•ïå¤TšÊ¹=¸Måpí~¸ô´¨áR TŽÿæ/„oýˆ tÕå]S T{°¡5Pªö¶MA©ž=GTO¸}ìHªòövIÕÞn U3{.HÕÞ>ö -:-{šâ ÓªeÒéÛÌGNôaìH'GÒƒ^%6ç´é¤‡LËÒ‘NzÒbXRÒÍ0×I§=oÚ:ÒiïœFH'EÛ«‚Núó¶LèDÚ>æ1@§h9– -d¤“×X~c¤+-ctRµ´”Ußfn)«Jê=çê܆–±jc£”sÒA6ÏÜáœt¤ciëtØzy8§ýnê3Ví›–-KŸ‘â1·”u’ßÈXú”Uºød -:%ËÑrÖÉ—úgÐiÍ(è´¼Œ:EQÏ9Ými9«–‡–³ªç]žä¬“.ÈÝ:Î_' -éÇÜqNä`Q’rN›³]Þ¨ÅRæþú†t¤É˜d˜ƒ·`N:žMr6ÌùOš‚9é -«æjçY,_n˜“¥vÂ0'`Ù·†9)[¾Ü0W¼¹À\ñÜ Ì¿@™9§XÆ9‘ºmrÞ8W<Aî97꺄5snäFsRÖlÝ@§"¥Š:ñ³Eœ1ÐIi²ÀK@'J³_½ÐÌÓ:èD…Þ×–¹ÊóÃÚg®bSO[Ë\MùžtZ.}æªûm‰«JÜ6éª SKÜ&ntR§äwЩ9>µK¹òÑŠ…w:ùÆ¥´Äu´…Ñ:‘\ç£O\U„=æ -:±¶!²œ<bm{ k{[æ*Öö¼M:q¹>èFÑh™«jÚ6# Szìçè¤niñœÇ–¹š]ÝaNìr´ÄUÊÇ8椼•þ -„Ô¥%®±Çœ”‡µO\õ-Òž¯±GA§åK\µjn‰+®8 SGýèW9óÑWmN£”’NzÈb—$‚tÒ“¶¹%®£28@§oìóV霳ýê¯v¿ð蜓î|Ì}Þª?L0MÁ9ËÞòV-¡ƒszš4ÌiÑ®{(æDgáÜèë¦ÀÜ8ÅõqÅÜ8ùXßc®,âvkU¤JÃXÇœ”5U·ïjBw†œÔLÖ‚›j–ºß!'E›Æ‰ó¼Í턔ǥT‘ò¼ô+UÄÖ¶*âTø¶I?Eœ–‡~µŠîÖ.'(ãÔð¶ËFÊ8Õ¹íœ ÆIݶ¶Õ*&ŽÁ8)/Üãä:;•qÅÍƉ˺ïýr•¢“‹[0N¼Ù%嬢Ù[¿\Et\q`aœÛÆ/E\‘Y¿^
âj¡—2®–u医”91N|lòrƉ¿=ím¹Š<ïÌÆÒZÎ*ºöî±› ®–+¾ú«E¦2–¶ZEåk[y¢ˆ+$ q…g\!qƉò<Z~Sûzo«UŠäVe
ÈI¹øe* 'uÃÐV«Ä>rRž×~µŠ¾÷<äô5~mŽmºÕ*Z5µÕ**OmµŠ|=qƒ3äÄØÞ÷¶ZEÛsrÒE»~+ò‹žs[®RàSN»ÞØ/W‘î¹ÛJí62>5ÌÕò0Mýréå‹]DPÌ)X¶¶\EË–,æôL±LV9g¤Ù‚sJ¢¡_®¢ûÚr)ûl圖‡'ËUô·'·.œÓ™ÍiÎÉŽz (œ‹òØû¼UnŸ²Ûijt!ÏH'á~y*P‡À
êÄÞ^사¢N~ÁsÒ@œ“kK[7Y9;7ÔIy0Dêd·{iW[夆vå;£NÅñcÔ‰Ÿ=n-oÝdÙóÒçrò[@²²¶Ù9\÷µ¿àª“‹KË[õg)§¶2OÎÈ͸¨“u…óØ.DrtZÞ*?Xz}4w°lÚQ'Ž–†:Yq^ò…ñ±·±åâkÃdEÝà‹z2êL=k¬“ÅéëÒX7´ÁºÁ®ÖÉŸMëŠÏ5fÖ©ÝòV-—–·–âSž™ub_ï-oC{+Kc]-/ÃÒ³N~5khykìÖéÊâuòÖ–êä%-œ³-º¼U«¦–·ª:>µ¼µøOsu¤«rÜ[Þ*Í9m~N~qÚzÒÕžä÷=PÐ _·Ò”HÇ+{Ÿ·Êìx±ù8é42™î<UÐÕþ¼ùª™ - „C!É„C!pômç -I& -‰ƒÄ¹A’ ‡Aá0H I&ö„à q$™q$0.íC‡A’‡AâŒC q$™qn€8‡A’‡AâŒC q$™q$0Æ!dÆ! -Q³DŽ³4o¢f‰Ô[»ËŸ®9Ú]þ¤é&š[!º®dowù“²ßoDÍ]Š´÷wù“ºc˜/Ò>67@Vëxrõx™h•¾9í.Òu§£ÝåOºö2ÆP³DW0í.rRIØY"K“äÞ½¾š%ºÖèXC-™»’«%²ðFË;ª%R·´[’ÈüÆ<j–Èb&Y¾Ó~8–[[ªY"å²·»üÉZžµÝ“HÍ]ß3a–ÈBª Ó¤hYíFßƬ~Cý‰4WK¤¼¯í.B¡Z}«Œ<ök n–HyÛ]þfÓü0K:ŒºYF], ŒºXÒaÔÅ’À¨‹%QK2GÝ+ ŽºWu¯¤ã¨‹%ÀÔ¼’`©{%™¥®•K]+ –ºVÒ±Ôµ’`©k%S×J:˜ºV0u$`ê^IS÷J¦î• -®sÂa”dÂa”8áJ BI&B „C(q%‰qø$@ŸÈá“dÈ!”8äðI€>I¢: ”C'rè$™rè$PF@9t’Œ9t0‡NçðI2èðI > ¤Ã'I¤sÄA‡Mè°I2è°IâK¸MèÜ&ÉœÃ&sØ$p›$s›Îa“À9l’:l@‡Nâ Ã&ɤs›Ða“ - C!É C!t($€‡$ƒ‡Ðá -üF*×2…4"ðŸ’5"Ëà]ïPkd°…õ¼Åb×eu±Úˆ”[¯ÚH-ïËKµ¹7™Ï!k”äœÝ#A½×Ì«52IÇ°FäÛj÷YPkdÚÏnù`u8/Úåúø:OaHY.JjìÚHÝîÈÅmYM7"eY¿í›è¸$uî|¨7"e•(ÜÑ‹ì.&¸6"UûPB‘+yø È·Y0\‘o<.sh#ò™üA‘ç‡P@Ô‘ªÍ ±Fä ®f‘¨62ùÒßFµi½{¡k#µ¬kÐF¤7gtåCšs_ÆÐF¤Éýf#ªLjOÄ66í7¸ÛŽ62Èey#2Ì7ŸÃ¼‰íý³lv©}ÚcýQG ¯ØDµ¹XxŒM‘ëvÛÑ´91÷¸ï‰i#EV½OM©G\pŽ6R¬±¼˜6"×·§ä™„9š7RŒòÑ=gÝÏ2'm¤Ø’¹ÐFÒÝÉB‘…ÃÑ´‘â¿ð6âA¹ocÚHý†Øhª[ÚHÉÞ˜¯ªuzÛ7¼yͱ4oDŽÚ_ÂIE£X#ŽQ¤‘ŒQ¤Ç(ÎÅÉE£H#pi$si˜º5K±F2K] –º6,um¤c©k#ÁR×F€©[#LÝ ˜º50uk¤ƒ©[#S·F€)ÖH†)Ú0Ŧx#™¦x#ÐT½PŠ7’PŠ6JÑF@)ÚHF)Ú(um’¢$’b@R·F -=£ÜìÖHÆÜìÖ˜›Ýs³[#t³[#nvkÒÍndÒͦ -ÏåæðÜ-‰9<wKº9<—KbÏå’˜Ãs¹¤›Ãs¹„´ÖÝ’ˆöÜ-é¢=wK"Ús·$¢=wK2 -9ì ‡>åÐG -å°G ö”Ãù¤öH¥ö”ÃrØ#•rØ#P{ÊaÊ!@9ä(‡<R)‡="Ê!@9ä‘J9ä(‡<åG*åG ò”C©”CrÈ#P{¤R{¤”¸¶œ' ‡=ÂrâGD9¼‘¤œ¼‘å¶lv!}œ‚žCNÞÈ‹ròF’r[’8(ÞÈròFrGrG^“8’“8ää¼ 'o$)'o$)'o¤RNÊGRNÚHRNÚÈ‹rÒF’rk*hÒÈ‹r’F’r²F’rmuP’r²F’r²F’rn¼'k$'mÆ¡TÆ¡ˆqX#0k¤2kÆa -9¬ ‡5ä°F*ä°F€Ú“6R‡5ã°F`ÖÈ7Œ“5òbœ¬‘d\X#‰8Y#/ÄÉIÄÉIÄÉ©ˆ“4’ˆ“4’ˆ“4òBœ¬'i$'iä…8I#‰¸F’p’F^„“4’„“4’„“4ò"œ¤‘$œ¤‘$\Ë<îºÈƒg'—œk·Fqa@8 #®/zm¡*xþh%¾„Ãqø"qø" _Äá‹TÆá‹À8„‡0R‡0ãFÄ8|‘Ê8|‡/ãðE -ãP=`ºŒC©ŒCqeJd¹îâ$‹@8l‡-R ‡-á°E ¶He¶Œ“.’ˆ“.òBœtkW‘ -·E^ˆ“-’ˆ“-’ˆ“-òBœl‘Dœl‘Dœl‘âd‹$⤋$⤋TÆÉIÆÉIƵì¿×e‹TÆuÙ"0®Ër}Ï6bB®Ër]¶ë²E -äºd ×%‹ -¹Žâ"ÈuÉ"@®K©ë’E€àr]¶H…\—-’ÛÊr]¶H‹"¢\—'åº<‘J¹~ÐèÂñðô! ×å‰TÈuy"@®ŸIbwº<‘ -¹.OÈu‰"@Q¤BQÈ!Šrx"ròD`žŒ“'R‡ââÐD@šHEšˆ+ûˆå@\©ŒCrX"@K¤BKÈa‰ -9, ×¥‰@¹.M¤R®KåzX"@®Ë©ë²D€\KÆuY"•q]–Œë²D`\—%R×Ãq]šˆë{®”SL1O q}ÏypG\—%ò‰8,‘Š8,‡%â©€ÃpX" -8ì -IÌ…’”k«’”“’”“’”“ò¢œ¬(‡åÐB*åÆ2¡çH+Èa…TÈa… -ùd\Z!ri…@¹´BÀ\Z!•si… -¿´A :ôK¤à/m -bÿõ:óî‚X̾ȸ Ï¿ýkƒbÿ~Zû¸ Ö£<â ¢/p‡òü{³®1Â¥;VŒA±Žëùä.ƒ<ÿ~nx–Ë Þ×
‰Åò¬Iëþ׬ó|Hø…» Ö“±N.ˆõb¤Î¸b=”×RE
[º Öñ÷%úä‚ØpÃÜ !Äb6))#Ä~b(ŒÆôÿ"ù¸ÄÞÓñ1‡íL#ÄG:ÞBˆ—ô–BˆéÓîM!ÄÎf"*H±~™~…bÿ¶a„û·=jþ !v•ìž „ØU´9-Œï/®ß¸b±!kÄf´íæX§#Äî]?Öê$#º¦þ£„Ø¿µŠˆ+!öŒ<·–ßøXŸÅ\Zg·µ‹ï”Bšå-ÿŽ/Wû<Ÿm¬¥Fìñíù›è2—Ÿ˜boÀñlŠb¯™5lpBì5œ[.h⯤õÎ-!'¤ÍXINˆuæo9!ÞáçÆ¥Û…ÖÛq)ÄD¬C’Ïçáû9cÕwBìŸ[¼lî„ظʱÖr'Äbϧ'3è8"Íÿí>¢~CÁ‹fã78!öokúà„Ø8¯ë%…XÌZ‹H!öï+öñ,*çYÿÿÁ © •’ •He„¼@*#JIJy‘TFH’TFH’TFÈ‹¤2B§¡„$M¥„¼h*%$i*%$i*%äES)!IS)!àTFȧ2B§2B§2B^8•’8•N1B*NÑBÀ)^<Å©<Å§î… -RÔ@ŠHQC -H1C -èÐE -ç0FàƜé¤Ãt2Ft2F^ “1’ ƒ¸€NÊÈtRF -;`‡A’°“ARa'$a·-,;ì$¼`'$i'$i·)‹¤’¤’¤’íd$íd$íd¼h'ý#i'…$i'…äE;)$I;öíB"yÁNIÂ.$’d]ËNËY~a™Çɺ–s¾Á:9$/ÖÉ!u8$°‡¤²n¬U¦…C"uH$uH$B ¨Ã!©¨Ã!u8$ ‡¤¢‡Ôá€:’Š:I$‰Ò!‘|.’‚ºTH`]*$‚]$•viw)À»H*ðÒ xi€¼4H*óÒ z©€½TH*÷PHà^*$€/’J¾TH@_*$bIe_$À/
è—IÅI¶õdd[OÉ«'$Ûz‹mÑØ“GòjìÉ#É.mx$Ù£•GR{´Z׈4’ìÐJ#yuhC#Éþ¬4’º“Fòº“F’CwÒHrèNÉkèNIÝ©wÃÈ<’×È$¹“H’#wI^#wIräŽ}0r'•ä5t'•$ÇäØT’:v'“$Çîd’äØL’×ØL’ìÐÊ$É–žL’WKO&I¶ô¤’dKO*IÅ*‰ð—& üK“¤0MˆIÓ$©L“b’ÀÀ4I*S%ƒ©’ÀÁTI>@øß²I²…?ôRI¶˜»M•Äè»—d³yf’‡K²Å8jÊ$ÖÀ¹ï”I¶×OB&Ùl$e¤Lbyëg8>Fmó§˜$óçøh`’L¨9Ž4Iž#Û2]V&És$Od™$Ï‘øÍÃ$yþ½š$Ó“›:&‰Íï×ZVÄ:N6©Ÿ¸Jbø6Ó$±ùèk;Ó$«7´ø_÷•"Ém™ås‰$÷Ïñañf°D’'fgŒHbŸIËÅ@$±ÏäsdüÄnwëV ’ÜŽ«%’X€Å…0I¬_aiK˜$öRù 2I†5SÇÁoîR§yp¥I2|¥§–&ÉÐ÷À#“Ä®’¥üa’_骧Ibáí|›$Ã×áêi’ŒŸã%Ç$™¶àX_¿¡ÿÞZÄM’é“*gš$öôæ’,2I,kÇÀ´öqx÷“ÄÒmìãÌß±aVëXû“dúÊZ^ä¹ó£¬{â&ÉóøZ2â-ó,³4IìͼO~CdÖ|?—HòÜÉË®ˆD’fw+×— ‘ÄÙýX"‰µ·k‰$-(ŸÏçᦺ]¤Ib
‹ý\&IYc,M{ç¹L’MUû1I¶põ›0I¶Ÿe‡…H²Yù\"ÉVe2åIÙëЯ%’Ø6ZmÄSž÷ñGXñéŸo’T¢’ -RL@ºö Å$© Å$¤˜$€“¤€4M4M“¤p4M’àhŠ$âhŠ$¤)’¤)’ -R‰$p“Žb’TŽÊ$£˜$`“¤b“DE$£I¶—H" E$¢ˆ$M“¤0.U1.U1.]’¸tIÄ8É$"\Ê$…pÈ$2 €C&IÀa’ -8L -êÒ$ Ô¥H"Ö¥H²½„²IĺIĺI>X—&Ia]ª$b]ª$b]º$…ué’ˆu)“ˆu)“Ö¥L"Ö!“À:d’d& ¬Ã$u˜$•u˜$°“Öa’TÖa’À:LX‡JRY‡J"Öa’À:L’Â:DX'‘Ô!’TÔ!’À:D’dD’ë$’$ëB$IÔI$y±N&I²nƒÊb]˜$/ÔÉ$IÔÉ$IÔÉ$y¡N&I¢N&I¢N&Éu2I’u2I’u2I^¬“’¬“I’¬“IòbL’d]îC¬“IòbL’dL’d]Ë.K²“Öa’Àº0I*é0ID:D‘.E’BºIDºIDºI -éR$éÒ$êÒ$)¨K“D¨K“D¨K“¤ .M’@]Š$B"ÉöÒÉnõý…M‘D¤K‘ä“t˜$•t¨$®Ñ[Ðá’TÐá’ -9L ‡Iä0I*ä0I & ”Ã$©˜Ãs˜$`“¤b“Ì}æ0I*æ0IÀ& ˜Ã$)˜K“D˜K“D˜K“¤`.M’À\Š$Â\Š$s)’s)’ˆs)’Î¥H²¥w&‰@—&I]š$]š$]š$ti’éR$éR$)¤K‘D¤K‘D¤K‘äƒti’Ò¥J"Ò¥J"Ò¥KRX—.‰X—2‰X—2I]Ê$‚2 °C&IØÉ$v˜$À“¤Â“Øa’ -;L`‡IìPI*ìPI;L`‡IR`‡HìI€"I…" °“HìI*ìI€"IÂN"Év2Iv\ìd’¼`'“$i'“$i·1eQh'“$i'“$i'“äE;™$I;™$I;™$/ÚÉIÚÉ$IÚÉ$yÑN&IÒ.÷!Ú…Iò‚L’„]˜$ɺ–=–d& ¬Ã$u˜$•u˜$ÁºIĺI -ëI„ºI„ºI -êR$êÒ$êÒ$)¨K“D¨K“D¨K“¤ .M’@]Š$B]Š$uˆ$"]Š$"]Š$¤[&IAÝRIĺ¥’vË%)´[.‰p·dñnÉ$xK&ñR&y)“$óÒ$zi’€½4I*÷0Ià^š$€/M’J¾4I@_š$°•¤²/UÁ/Mè—&IÁ"I¶õ$’d[O"É«'‘$ÛzÉ65ö$’¼{I²K"Iöh…£W6L’ìÐÊ$ÉL’W‡6L’ìÏÊ$É¡;™$¯¡;™$9t'“$‡îd’¼†îd’äÐ]toräN&ÉkäNHŽÜÉ$É‘;™$¯‘;™$9r—ûÐÈL’×ÐL’»“I’cw2IêØ& cw˜$ŒÝa’Ô±;LuhIhé!’Ô–" -=DZzˆ$)’Ë$ÿ–IR -ër±.×8ër“º\ãD¬Ë5NÄ:9Y¨Ë5N„:™)I:©)/ÐINIÎa§$çÐS^œÃOÙÒLIΡ¦TΡ¦$çpSuÈ)/Ôa§$êÐSuø)uè)‰:ü”d•ê0Tu¹Ø‰XÇb'u¹Ø‰P—‹u¹ØIA].T"Ôåb'Áº\ë¤À.×:ìÖ.v¹ÖI†Š`‡ ìT*ìd¨À:X‡¡Ra‡¡ìPT€ŠJ…Š -°CQv(*v(*¢† -´ÃP©´ÃPw*àC¥âCÜIQv(*w(*àEÜ¡¨|âE¥âEÜ¡¨€;•Š;áCàa¨Tàa¨@<ˆ‡¡R‰‡¤ñ\J¹W;—;)ÈËåN„¼\îDÈËåN -òr¹!/—;òr½“ż\îDÌCRIèa©¼¨‡§’ØCTIìaª¼°'UeKI%©‡¥R©‡¥’ÔCSIêÉSyAQ%¡‡©’ÐCU)ÐÃTI衪$ôpU^ÔCVIêåº'¢^®{R°Çº'¢^®{"êåº'…z¹f‰¨—ëžõrÙ“B½\öDÔ[»êå²'…zÈ*¢® -ÔÃU©ÔCV{È*`Y¥bYìa«€=l•Š=l°‡ö°U*ö°U„=É*PY¥RYê!«@=d•J=d¨‡ö°U*ö°UÀ¶ -ØÃVùĶJŶ -ØÃV{Ø*{Ø*² -ØCV©ØCV{È*`Y¥b_칟â“(½\ù¤`/W>öråa/W>)ØË•O„½\ùDØË¥Oöråa_%±‡°òÂÊJbOÎJRiåE=¬•-}•…= +/ìm´ÉÀ^+‹zRVÞØ“³²°·%¢…½°V*õ$,êÉZYÔ“¶ò¦ž¼•E=–@z,R©Ç(`%PÀK Tì±| Øc aP*öXìå.„=V@©Ø“·ö¤$ö]š‚=y+‰=y+‰=÷V^Г·’Г¸ôW*ôW€â -ÐC\©ÐC\ôðV ÞJ¥Þ -ÔÃ[zx+•zx+PqêI\©ÐC\zˆ+@qåèI\yAOâJB/Ä•džÄ•ó$®À<y+É<y+/æÉ[IæÉ[IæÉ[y1OêJ2Ïfâ¼$æ±Je‹ À<-‚òX¥"EP@‹ €<VA)Èc'ue!OîÊy²Wò¤¯,æ…¿òFž–-Õ•DîJEîJ"y%™‡½òbúJ2%™‡ÀR ‡¿’ÐC`Ièa°¼ ‡Â’ÐËÕP½\
¥@/WCôr5A/WC)ÐË•L½\
% —‹¡èåb(‚ÞÚE@ÅP -ó¤°y, ƒ¥"…ä¡°€<– -= '‡%™'‡åÅ<9,É<Ñ7™'‡åÅ<9,0O -K2O -Ë‹yRX’yRX’yRX^Ì“Â’Ì“Ã’Ì“Ãò‚ž–„ž–„^£ý†K…ÐÃaz8,•z8,¢ -ÔCa©ÔCaz(,P…¥R‹ê¹µâs¹A½\¥PõP½\EÔËõP -õr=Q/×CõrA”E½\EÔÃbIꡱ¼¨‡È’ÔÃdIꡲ¼°‡Ë²¥Å’ØCc©Ø“Æ’ÔÃcIê!²¼¨‡É’ÔCeIêá²ê¡²$õpY’zÈ,/êa³$õraQ/F)ÔcaA/FôX¥0/5óra”`^®‹R˜—뢈ykÁ¼\¥@›EÔCfzÈ,•zØ,P›êa³Têa³@=t°‡ÎR±‡Îö¤³@=t–J=tQO6ÐÃf©ÐÃfzØ,@›¥BO6ÌCgyè,•yè,0桳|2¥2桳À¼ÐY*ñÐYD<lˆ'›¥›àa³ -< -ð.„––¼Ë¥Q -ïri/—Fðri”¼\EÀË¥Q¼\e/—FðZx-/àá´$ðZxX-/ࡵl-É;Œ–Ê;Œ–JK§å<¤–VK¥ -ñ[z.«¤Ù¸ ^K%bÄClxˆ-•xˆ-³âa¶Tâa¶@<̇ÙR‘‡Ù"ä!¶À<Ä–Ê<ʇØó[*ó[€fÐÃl©ÐÃlz˜-@³åz˜-z˜-@³èa¶Tìa¶{ˆ-`±¥r±î!¶À=Ä–Ê=¹-pÏÒ•#[!¸—«¤îå*)â^®’"îå*)…{¹JŠ¸—«¤ˆ{¹LÊâ^®’"îá¶$÷[^ÜCoIîá·$÷\^ÜÃpÙp[’{È-•{È-É=ì–Å=é-oîÉoYÜÛÒâž—Ê= .|2\ø¶œë(à“ã²ÀÇr)€åR*øX.ð±\ -àc¹” ->–:|,—"ð±ZJ«¥ -^šO·IËJŸÞ9ø±ÏhÀþìÓèœvœc4Gàì±JýQsßgilNgžY—ß“êŸËás*
méé²Q€Ëç±Î©·ÿÙæy!½žšÊå§ïï
&I»b-øãÌÅJöË:‰ö§W:Z·ÞWÔˆç
Ê sH‹Ø´žÏŒy’Ó3èX5p·ÛrµqsѾÄ}b‹ö\ö‡‹æùvWÊE³|{G¹h»È-/šePìÇ|]´]hä¢í&!Åô¥_4›h÷ÜßrÑ,3ሹ:?”=dG.Únïãq¿.š=D–çÍEÛïH;ä¢í—žrÑ<½ÀÒuÑžS=Öö‹æëðÝÍ9ûýÖf^4Ûž1çì·×¿ýï‹æÏìŒbãv–¯í˜•ÝÓz|åî-*O7iš—7^Q†¨³ÀÍû©<¢Mq_6¥¨n“³,WÙkš>??¹,§àyw}ÙNo{ØrÏ^§b›¤¥“ûð>G2¬¢¡sô©Ößõ_ãÜ®Õú˜§ÿm›H¸áª.‰·>| -üÁñ–ê®|uK -jÑ -ê£Hg^6o!ùÒßë²YÉZå\6o!Ù§Y—í³a-¤#\7o"y±·¸nÞDšíuݺš›\7o#YΣ®›µ‘ÆëªýÛßîeöïÿðoþãïÿ—§?÷wO—"ì¯ú~ø7ÿ·ý—ÿåOÿÓßÿçÿƒýü‹¿øýïÿê׿ùëû¿üaûñOžÿÿïÿñ‡¿þçÕÛú~_Ë{Z?ýizy&Ò±[¾9ÿú„›‹ËölgøëGØîøó²}ýØÉo„s'¿÷ÃûŸ°6Ò<\8½³åÃßô¾îk»#ol¿»=OÃéøæBËÓûæh¬½À±‡ñ:GÑóýiÌXGï{§d;ùúÃßÚ0:Z’oïC -¿6ñ×Ãݤì–ÔëÁS!w#d#¢_ôçæÈKõ´ã(Ì=ÏcöqŒÚ VìÂÎã»GõKîåmDÿæœp¸ñ9ö°• ‰à4¡>Žm^(Ú`ã®=wˆû¢ø(gìÀÄ
ý1oBû‘ÙÈÕwàKÚ°×·õòç~%¼u®Õ‹‰ ¯ü¢àÓ®SP÷È‚›®¥…ç¦CóÅrµW]ImûÝ#СÍn˜Ú…ÓÅ¡=áqp•‡µ"ý.ÍæÓS¾â>OÃ×½³éå×gnQ×Þ÷NѼ@·~ù^‡Íƒgþ±¸§Y§:‚ËÒ¥,¸G®‹]‡Ý¡£°µd´•€#8×Pk¯6ú‹vpî±'éDpZp -*â6PDì@øó‹âϦbwîÑR|´Ç¼,^’&~ßÝ«b-‹e¿Ê<’g -^[þ>šn>®›Ã²Ž¶‚ÏÑÓ> æyzÆS<â0lN$žæ¯È>yÄL± %]Ì|÷/] -j~]NËFãí^OÐf³Ñvó"u/5BëÊg°-(wþ°²},fù<ÅטÁ¡nà<F3ž·‡y®¿ÅߚȴÑ6>Ç-x˜Oœ—uúªèiúÃz¸,hƒlºOÛq(æ3ÄË}Fͨ›øUáûäZáBßÅå"yœ€•¯‰˜UˆÔÅ‚Zö_éÆ>/ÒW…¯›÷c¬Ýî÷ÌÜq(xíù¸Y£•ýÆ2ymÿ‰½Žµ×1[î Ö'ô‹k…î,øl‘íØ!îÜ:ŸØòRSÃÂ'™#>´ÖMòªz¶OvzmÁóíÎ߃¨l{?+ŸCï¼;_Ï^o^„{È£a¿µçžë
oO7¡
lSËì`¼àž(óU6“g¾µ¶åQö©}mxò·žÒ:1·HãñØŽ]ÛzÒy¼Öà‹ +ôôZsì íG†u¼o¯¹‚ñ†ŒÐìòÞ¶ƒ?¶íùp´íø8‚+jDÆ’1ö$^·úÌ>)ÍSÛݯŒ^p¼ùÖ‚8¹ŠÃ¾œjEyjÏzɶqr}ç-?vbgÜñ§±Ô¯£l?ï¥8g°ÏªÊÅ{g¶A^/ÅFCÞ³ð~Ñï}¸Tg;âºØWQ!ÑÜe¾÷e/àšü)ÓI"øtýtýéVð¸ÚS;°‚¦Ë•UöÛ@Éqí -ncêþ÷9öüµOÏ ±ñEôÒ‰]Ç¿ßw€{xê}l8Ô€ôhÛ¸×ÇviÓ›3E|»®í¼ß?÷Ç‹ðŒ?opÚÁÞõ-°öck<&›ëë´ÙÆ|Öâ½z>&OSH—äiÔEÐܶÃÚ‡^¬kz{q[|ål@4.@¿ n½q -Ç¢<}þó‡:J±×èz?ÍÃìsÙ
ôOäó5›¾ï=>§3æTãïoqÎÁø¹Ú)§•XoÏ®ËrŽÉ?õ¤ÏŸ{èÒr•ùèÆ//{«-íÝŒ`H¿~¤w¼fÜvéâûd%†²MÆÛ{Zª‡´õ8‚ÃËãN”VÒa…59Uÿî~U+ÅËÀ¬7 ‚.^¨™NpGOϨ(ßsÒÔ³Êà -f§Ýcñ{«n\‘1¯«7HÁ+{Â#ºEñ{k~ò`n»þÔwƒê~êro{î VÙõ“ñ5·ê&ç9yØ769“v–˜;8£Ñ¥[~©épœÙ„}¶ÎöÏ![#¶6ÉSÁy'‡tgyf<#.þ\¯Ô‰Á‹n•²3;£ƒd-`+6Ím¤ð„½F±.ï—ËŸ_ø.2<rÏÑRðé,Ú/¾c¾²ÓR*ã¯íÙb^ß
sys¨DMK³/sTk2Râa½«ÉlMþ|Å÷“ÞÁ™ïBÞ]ŸÃšùÞD{“·¯©`c|ÒSÄù9_ó;ª*Øî^. ‚ìnÖqˆÞÍ}•]YàÑzòùç•Ï·ë«ßÞV¯Í3Ê~ò>×£¸)ò°ç>D‹¨ën£Â¼e¦ -¢¾Ÿº~‚¶³ëaóó.6û·eX-œaßUþ·ð³#_9ÃþNŒ_?A{³/ª=ñKdï€ —J«Eê¬U/:vO¿~¾Ng;^º,oËg{ýgºö]e\ý¬|ʯ¾eŒYÇÕlè’ª¯X4•Ÿà®µZº¯„bÚ'Ø£ï÷γÔl—3~Ã>%çõ@÷w?ÄéÆâöáz¿0—µz"è“~L·=ˆt'$.âÃ._IëÅ
øö´þÒ¯Øò˜vsÔìü
ï>“è—ÊÊSØ@§Önݱú\ÔðOoƒú¼V_ôóÃRüçw'Ò«~QîógÍ„ÝÏ‹Î6}:4Q6Â7õU&lC›î·Å«ìP½fÒýÞWÄöÝòtqý6¼õ ‡úí¹þÑž8«cjSLc›ËèM®Ñ†K -Çlk¢¢MÀøeŠ÷s‹BÂþ©>ƒo¼(ð45\<‰'чP‡5 -öÙ¸PÖf·ûç“Áû¼õlzÿÕùà%2¿=Õ?ÚÃæ鶆_»Uè‘«èƒØöfÛZƦ¾}d0^ü3ÆÓr>xgÁY\ÎHËÃsðO¾¡ìµ8_Ï]òóõò›vÁ4%åA»³àŒîÂð i»Ë~}Æyø¶6†bCqÅÍ=õ3°|{‹õ&–{àE¨¿ˆ}¶š…w×"üî…1ÈþýøÄÚõu%›¿M·¿ÜÏ3Ó"‰Ù¿i»-]òõ8}ÓԸܞï»}Vg!ûNm6XfÃño n×iúþÔúâaOð>£³ã7ÆÔØÁØbf5¾ã>=òmØ”wɳö¬a+š¼ñM;h팂øþ€ºvm¶ãô#°·¹Œhžñ2uœâS÷´L$3;z|«ïXcÆ÷êÅoÿò‡ë½™¦&Ç7x7.NñÉÇg~§v·—íðËhj¨Ÿ„ãòïºÿ…¸4Ý°æA¿\ÛyEëőÛÍQŸnX¿s¶øÚ
ð8õ šX.òn1Ðáï§zA¼îÄðÔµç";xmþ¢_º½qÁL/þù8¶#ÎÀdzþR_;·Vý¼Ä\<¶£ù‹;´ÃïDJÝÉR²®ëº{<Œ>7ùÝ'Ô3½MèÓÐÏî[¨C޳ϟM´?a3‡{´5{TE‚öŸ§?yëÙ
¶e·¬Ä‰_^ËK¾¯BvàE™Â·'û³¿‡ƒkAù.öàl&#ñ¦¶(Yh=Ðíy ·Ë‘{Ù·üšú]Ñ̺¶CÕ—`ó¯Íþœù%h‘2ça/1÷›Œ¾W¯ ÷—ºož çÛú"’ÑøÑõ½,âr†ùTÔÆ¥9}1ÁøâÆrÍÖ,°¼v=dÞ½´mýÀìt(±ï—ÑgÈü2žV¤Ò>gžƒeIïqmÖZ -¿û¼~ïÙŽGþ›7Áùï¾5ß}¿~ã]üÞ{ûÝ7ü»Wö·îÂwï×çý'žož—¿Ô¶^5×u‹‹h};}.¯—ÍßWñ¾£ÌÓ/zŒtÁ•û®m=™Ù[dúf~ç+ôO|±¾ùº1zñí—ð{ßÌßø¾~ÿ[üݯöo|á¿Ûøn»á7Úßm|§åòýoÈo}o¾ûeúö+öå7¿x¿õuÜb…ßï°²ôœ'A|U&u¢º?ôÖÇ>Ý+‹°Oø+âÉ‹±OCòçë¹<ç÷¿ _þï~(&ÿÜÞÎ ÝJzäë+bO—×ZãºßDâW¿ÿá_1¦{©ûn -´“oƒ¬WSƱFÉl€ÓûòØZ³›O?F7u,¼ê£#À‚ÖqóŒzB_>Nå -´q†÷æ·~ž11Ç^thd¼ªçíý‚14b -&Çèάó
¾Q·väÄÃ6c\"bsœïØYÏ‹_ÛLzÿfKwb3vÚmâç%¼Æ,¸ïb›e0èïœ'l<!Èžƒ">µOm[¾#nj ÞÑZà -ò~Úl1™ióöyº‡&·=cÞq—ðtöóïå
g§]"bÜñÓž -&⶘d]Ûž[°92V>C¦ñç_áKO§ËZ‘îqÅØ_cM+"òó™6íz\ü)o -xp¿ïob^Œ5Ÿa>úÜ©?Yúó“ÇÍ¿h>fži ¬ÝÑAzGLVçé+<£%AŸó—ˆ¯¼!Ì[úÖ/þ\½ö¯½‚§ÄtëYEÉ8µo -Ò™9è’ZðÞ²áu…]ý~}¯Hy‹Ã±Ù®¶À'ÁH|…궧i‚b…׌ g‘® }Îzo[ƒ;ÙWlóg•éüû”¾‚gÜ¥±Xƒ[»ËœÜÑÛÆš#¨ï³"æek3ÆÏÏ=’£ê–G¤ßØ.Á„UhzL<-üey†²•FଅäY„~úÙÛÜf°VO„w|ïQžëŸœ—î‡'eþY(Ç¡Käèý)^öCà}Ü™ä‹Rƶ÷¤3?ŸV¾nRð©k/c¿h@rúÈrÝÒçøt1ük)V[~#ºf]¼+¨Wq&ùmì¥mºD]ÇT‚J¤¤/IX–ñÇöx%šå~]ôe]iR²ÇʉseÅùzE{Ös±*xARÝ5ÚÕ,a¸YSm³Ao†‰FÜ–í6€Fh|ݸ¬=^û•†U—Êäa+Q¬mcôקç>¾
6Þ³W¸uÆ©¼¶m¤ÍÁÉzû`¹®1Xý±ž6k±ÛàîgðÊÒ+L'Ýöºûƒe]†c{x0›Æ]%þ=LÓÐêsé´6e| ì ÂuDÁD“¡Q†kvÆ.>Æm~§ýø¯u!c†Õž;»ï¿Ý»ô€y‚çäö>/w+A^ÏÌo{Ǻãñ]9s‘àˆÔnv°Â^ ‡`<ËVñνڋ¼é®™$<Iqzê<ëÅsnûÑ?‚±dÁzBW8&=hk9•ÉúÍüSÁvÚ_Ûº´5Ì ¥®Ždù‘o¹Õ³Œ£íÊ7Ú¡E†ì9s kžjqxId˜Ï¨g0GÇz ¥l;ÃŒæÁPb -Þ1…ÂøÔ -Ó‰yGÚù|žL1|{í -ÜK›aÇ¥ÕœØ+è¸y -ŠðÓòIGmæ~]|#°|q ‡Rl,ŒcÔÊ°î9 ú*œ[/Á ô7ªnk_•>u -²ú‚¯m§®·¯Ü”NÓà“‚Ÿ§ðÚvo›¶½s:bÅ|žˆß—0×°Eý{'¢·?ƒcйYa0Ö š¯û¡Xâv3f æcè3hÛŽ“ ^ï·½ƒ6^Ýh£¾Âä!”§`wIÁkrZû®Ry8¬öSÛßG[¯ë -ö2q°¢eÔyke„±_ -ZŽR ò"<ŸÛö±íÕ5ã -2Þ4V¶½4íG0âÙ~Ë)ÔðT·lwËN–^Nñ[9óq–`6û~~lk
%ŸÏðGk'æ°åV0ÛQ9¸²-WöÈÂ+è5c?ï‚
£vòyî±ëíb¤æìëA¬a
|x%ŒMoÓd–¸“oâšR³†œîMÙÖ*nO½]P”àSü4äV8*#zpêö¨1ùôÒ!ì`…7nB‹zA1—}fóRv@Äø¹¬¦µ¥uLcdÒ†•ãP‚GTO¡?±Â¾šÝOµon}ºó¦¿zÅx)Á.ÜúøØÖÆ{6Œ-ƒ½Ju7£Ñc4e‹®_îjO·<ã™
‹Ì¾)Ê ²<X9ÀlxC/ ÏVûjÜl{íldΘ|\A^0/3þÞöRÆj÷*ä»b^ã`äTÛý^<²ÕÈ4‰íî2…gmô~õÌ<‰Á§²lëEÊ=èƒÕï`ÿYk½ÃQ8Qœ¾š¾”‰ùon†ÚvÕnõž¡áýª÷ÆËÄ'T㘙òæóÓ¼ù5è//žÂmËɪeâv”þÐص÷Ïè€ÝŸQØtÅgy®´÷°Ô‹µÕ¼òáðêpq^Gv¯øc–«¡é½ÝkÏätÛüضÓ<ÜT®é3x÷ú„0S?¶×Ù5pâÃrß½Ükipq|®îWÂçPkŽÁöèó¾‚=Û}×ꡯ™¦²mc¸¿õš&çÕücœ¥1¹a;èn³Bíµ¡NÁ~ «ßœ‚Û¿ú‹?<UùøHUþ×ÿ¬tek³ûÇÙf§l.À=¹SuxWøë;Ü”Îñõ½“߯üþT
_3仪_t{ ü™ÈzšÈ?»cÖ9´rÀZš™ì±“yáidô¶½Õwÿx<©–üïùòþ|IJ¿ž—<NoèÑߨJÛF«b»öÈgò gË~ñ‘Àá³7¶Ý‰FÁva-ùxÉ¥ žðY<4 ¸]w´¿GL´ú3ålóäÚC;ÊÒ÷3¾¢N‰‡Ÿ£½_Wg3_ª]^e"¸«“3¢vjìwFN–.BÈOPS~¾àùÅz$‚5M—äÎ;oðÙµ×ÒA†m >†¸6«˜¨¬’Áø×Eðõ <èëóÆlQª×Ã|Óį -3Ú:£t¸[浌¨˜aAµ‡<èác¿Ox»t`>4;˜Ñ@µàáâœØ:±K/Ä#ã…Òžà‘#¾2{ìôŒõ ýP·¨–¦N`Ðð÷àÎAéÓã¿Ï³ëù{¯ù®G¶ñûkÆ離zÐ+æEÐƽc—¬ÿ[^OÕƒ^»Õ·Ý¥çXùÚ#Æ·f|FÙÁhyÚŬLн3ÍÓµ‹[æCœ®ö£¦ñÇø([Ø'ÅñŽmíWýʦŒþŽyµÜ'8"+J'|ñ$ÕI¥TA,ìÄ1noA[tT»ðj¼ö·¼ï¹Ûëý×b·²×E‹àžtf+¨FÓ„v~>:Ü-LFûcsã·SOÍŒŠ?º“§Î×D¤¼Å«;l™âsrb¡³bƒ‚š…³°ìÄÑFF¿ïsãŠGs؃ãæcÌÂ*ö`Ûîq -$Ú{³kS
9Ú½Î8-³²¾ñ{Õ›×Ùê9¼#•O8Öu¹c©{ý¥–¿×”éê'XÐê´ó·ô~¤sé;=öÜQ_”ùªð8'_˜"Ù¬‘±óÄjг¯cþ“ØíŒÜ -ÛAv4N}\Me™ÜœSy&‚Žm/Ï\ìÀÆÞ³=Ý™Þh;Ÿ«òæYÆYr’Ät›Úi]ôñ¿³íWÂù43·æn$øÔ(·ÏY—xØïjyòa°c¸èTÜ* m*ý“̔଎0;‚ü^‘…áG/ä±~ï*im¹Zpl´³ÕôµàRt@¼^Sc@á–ódÁýÈO›î¹åŽï4|N¾6æ0£ßmAe¬ûƒSAmM¾FK¾õ=Õ^'ÃÁ$ý[0[ÐÜA$gÔ'Ôv0ò0ó°:°Îq¹æÙ½Œis¿Nä.
DV€eYnÙöÛgËß_ù¡XGSêúú6ê/í4ȳéÝÖp]x_‰f3odѯonìÈv~¹„kØÀCþØL2zŪåº5‘ØrdÐÛsy¶×óXržMNÉÁ€)¹Ù„V¯7mR_ëñžS'¶ÆË“x‡s§^É©Øѧڙ,Ȫ0ŸWdØ-“l“lw-³¦~‘I+1HÑcåØ눥?õó[[ΓC -c^_¼go#›ƒ±v»¸óÓ6–Õ_ͶªBã™ŸÏ Èë:¢7CÕXÁ¹ñ¬–ÿìäUæf¬ü£SUÍ›6½GL[Tl[
6„>·*%:6fÁ¼«@‹º[,7[É@M•tãVKÝk™s«Þnü¼Gڜͨ‘kŒÒnŒ /öÆHF¾\ͼ¬0•›úIɲ¾fö_n£OøèCϻذàNsú\ÝåÕf²¥}öôÐoöX7v÷õ‰Iè51Å6Ío%‰)O0êç»Á{æPL"ºïѺϿõUÑòdØ×>–նÚ2Ö,H¯YË2ô#ò’Ôžæíîªýg7"iªDT~eØ„WÛ¯¾©OP()jù®ya}b8vpÆ -rù¥Ä‚U¾ayÌê¼ó^’J[ƘÅçnÕö¶s8SûÓÓÙ7Æã]m½r”iP9ß,ªIóŠŽ¿º:ø¬“àä%Øòl¯Áƒ4TÄ0¬k]««5¹½mœxŽ3á‚SléËuÇ~ï4즪F†G‘ñ'M…·A;Ø/ZˆŒt
2ªi‘Õ¾¢LjXä™F¨õ*8v fª_„GQ3þ MÄCoÕ <ô™--ír4\vazÊäëα°Þ²9VºË¯ð5Á¨–в[³oåÍõÖW…™ž,/éŒi6uVûÝCÿ9rïn2ë‰ìw¿rznUÍcÖU³É-;crÒÖúò›?·cÝi†
nuä}ø‰ßSŸ`f -ংãÑ©îOÚËG´Bh¾ùŽ[äð¾7/8—mËÔl·9¨XrÉ”SööF¦Þë£èpgç6KæíÛÎÛEjf+,8² ³+{T¤Îð¶k{ñjî|~ëçJCí[Ö̳¹-Ë0=HÓ趕gâöUOcï!“yðÖê¡Ê¤g©‰ßëHh -'qf×Ê?¦hÏýª^m}ðNÅ4>`¿ÏÙ -Ûmv -¯`:y -z.n¨jÁ³k.ÏvÛøÐú üW…ÏRûr¨„•ëD9òÈb¹ã>jn+ÑÞÿÒ±‘–ëŸ%íÑ4äHêÿ3þfm¢L¬X»Pƒª8‡/”÷ú‚ÛŸï³´Zô·Ÿ?³ÌCê´IÑ÷´[~¤¶<§™1×9õL -Ì3PW0'Ö„ˆ]™sË †qæåbþGÍìC`{lQÈŽkdxäùQ
Æ4骘ݾsg{N0X8g-S¿|+…AÃGË•BG£ÊV+%R[É#[Å,îlAyRBìÀ -öæìý8¨Q×=kºVï÷Ì~!)R¶-å.f–]4·:góAÞµ^Œ¢øš™HžŸé©Ú &’¯1ûûD9__5jÕZΆ̛Š -½å'N%˜ì -¯çÐN2œ)É2€,8ŽÌ¡¿²¢÷¼ñéæ‘áK¶gRÕñ=1“¨ôcµŒÓS«ÃGòÒÏ`ìÅv›¹SJÇõêÂ9¨¦[/~c“xö2;©=µûÞ?.cº~¨ÊJÂÈÑ*c:Í -\‡ÂŽàD²[«G+ár0Ts¬"P#—¼Zn8çú}Ú$>y¡§ã¤*õ}Ôù†õ±Æ¬JôMv;…ý|nRÈ}ôƒ'Oñ\#«‰I¸ü±åŒ5–°’†Üîræ@ñÇÈ«8îôËFªÿÆÝ‚Öׯ)?7Vm+ÏÈó–å>l#3V}ÛtY"Å‚ï-ÕØR1¯Ö$ 'Urk¬/°õ}S8(O¼Áž#fÎߣ—[K]bÔÚÆbb
æÓ}ÆØiW›éä#lÒ™›ÿ -â:pÚøVõ›WÑ»Ú_ùJ¼³ûéVÜ
ÆQSá‡OÍÑ)×áèÙtæ`#xN®g1Ò<'º >Öûh¹ƒ¹úÚw–•Î(ëižðÏ—œøš]UÞÆܯž–¸={éë"d왶¹×7¹5[ü2¯®¾B6² ¯ð&h#§álDiew,÷öÓˆº -qïh·åOÄôµªŠq9ÙÃJ"±¡¯ûTåG–‡?µF[^CFÔzþ±\ÅŲXÐÓ|zæ§T<ádj14º³_åÙFáe=GdÛ€m»8¯L|²!_úÜkèjOÍ>ê7ãÅ*¦í{=WIfwô3-hK┾gNøÝTŒõÄÖœ”dó–zLZŽÌ8¹³.ŽÍªÐå½j -Ÿ6“©SÈ8«Ázgq×7+©]Q¯AºŠŠá^LÒZ]ÆnsìÌæ”O®ã¡ÕúQZz6O½ñŠ¸øÎô5™KkÍJ¸³ã®U£|X÷$‚®ð®EK,Ý q -x5wÌ[~U˜â‘w”€#8´_ú½Ç{sÎÉr&Ô¨»£ô“'m¬÷&«˜¶”Ôî5ÁñD{V5ÏJÜøVÉV£ñÖ{G¾*©,þfÆn5£àÝb€Õ{<Šè^‹P5ûÎ)BšPz¼NÙ¤cpGDì`dßäŽ -N?½Þ;ØŽ|ºàœÃ…§Þçss¯Æî¢g½Å®”Ò¯¤½U…ÍOG[¥1îUJÖò.ó&Ð>h=kšÝtî¼ÂïA¶Ú’DîÈÍøªð!óúÊ -än«´Áí=©ˆùÝYã8~?òã¼V²î›§Èg0~òtíóØ󂳞¼¸µE^”Ö'c]Áû¾ykÓžYyèZó'Ïngw=›–t/Y厎hìÀSå¡Š%ÝŸ\¦„-˜·ðÌô7ÛïÉ~Y¼g;Óaº#Ï3‚×Î?s ¼ØÕ*Œüü“ªrþë -ȽwÖì o‰8è˜é\Ý) ÞZŒ3vJËÙwƒÆv\wÔÒ9¤rÓ%ð ÔÞk‰^Çâ¾TêUs³V4CÙ!íÊڶ̱zK×J·0-ÜÁÀƒƒå?ÔˆòŒ„é–G`e%O¾´6ñ•ðA}yŸÿ ÌB;תÑq>ˆáxµN],Í›‹ÚÐ ¶’(žâæa5c¬,L¬[ï7G'¬4Ž,‰kiÛu1+ÖÔUýÉkë00u1kux´˜½_[}T¬æCwZÏ—Õ'R*ú[k-Ý«0·…™1Íúwªýeβ%{ÊàAWá¬S)y±ý–‹²ÍÝù£-w -A¬D_¨ÑÍ¿²RRBõrP¾=Õô²Ú¢WfFD%|¦1¢uÿÍädšOc¶œdµ¬Dì=ëokF÷ÎõÕ·‹dÂ-S4ŽôÕ}êôbzNÆ$µŠË·gÀ©uº~dÏ÷+á›é˜<ˆ^ò#ra¯Î(„˜_«"íÇ~¿ênåRøÈä¯ -ߙλêNß'©Cn0EpF™Sòå°pf§â`ùœÓWä¹}{ -eñ2sfÚV¾¤ß—ï•;wavÆýªð9S¥°šà*à#_¿¿“Ø»éþöÒ¢í¿*ÚÓãô:™ƒFÉ„‹aË^TXßíÅIJVkó^KŸ;Æß= -6ÕÃ\ÖX‹0ÜY lkµÿ˜ºËd¥¬€½ÂywNÙß¹„ö+¸¯µQWøZK=ß™ò -Ò÷¿Jíu›ÎóþØöŠ…Ç¢7ußÁµNV tÜY/ëðĵY`gmëT2/Ø–9eW;òßu͈kÑòãS|d{1W¬V,¯¹ -²-¯ÈÌ|ïÒÊM—H¿–ïlgtÀ~Òœ\®UÅ,KU0àÔÚóÛž•3ö,+_Ô0Kõ3º³¥ZDã¶í£a>¬±tÛîÉhVøl±×ºE+\Ö-”À¯kÍÌ©ëy’³¥\i±–µnQ Öu‹Jx¯Éh{o*«œ%£½ô\
Æ)ŸX¾·l»i«g KÕ°Ý«¤ùHxܽŸ4yØU¦<W
4ï rŽ -m–à/ÙWJ”mm±SW‡¿ÏºŽõ -lOYîáIRe.¼4J—²|‘OÖϪÛZE|¼ÉðôæEì †s®ósÝ¤Ï w{ò2L®§Oj2ÈlÇ®êÝ+˜ßT½eÛ¦Äk‚ýªë• «…¥ +™´¤M]ÅÈ¥mß?¶µÂ}ñT•‰v+[Dybdß~µ(ʶg$MÇa];Ë°†÷^> &¨p_u5"HÁ›ÙL”zäKÆ·sí`g1v/˜O¶Rz¼ ½’ÅóSk³&vXô§YFuc™Ù×#¬W>´/I?H-¾£NˆM¦ìm% jqQŸc9YËéid5‰WðyùášßÀb«d-C4ü%ø‹™Tè©n{Z«ªëÒ©³‚×Ïk‘¬=bò*^Ù-Æs’•Öóðu.ÿÛV7 -‹œÝäªF–yå -ƒ#Êà/ù|g[¥¹lkåDO†ÒZ1«œ‘ëøx‘לº˜ÑÜßð|<Wп™Ÿ3ºÛȬÿÍeSýÇŠ¨çºåjg–²nYÕË=¬]Áµž—QK•W÷\lØ -Ž{®•Œ^ëy™£×Xœ‚5ºl¢AKeµj|}‹o¶í”|(ëyàk=¯W8]£Î.m[+atÖán×$ë¤åB•WËe7t´e=¯,ëy•èZÏËTÎCÁÌ'ê¹ °‚_ècæBÚ“Õ³‹êCË–Š3«¥•M¯´æ6êú$÷±VÏT×۳˖§Õ¬Jù Ûò¶m~óñî>ÍóYÚà*â2³±%=~¿¢t±eÏ'‰]Y¦=ßB›~É‹l
V
^k¥f˻Ԇ¼YÈou*}*3v0rêøÌ™_+@ Ô¹–ožåboO_y®&ˆ2¤±|Àé¼õ™…ö˜ÝcHá<âì‘Á¦²f»?Z¿ãvíS›âŸ˜:?BGèÙŠ.Ao^p·WÙ`_£y׫Áܽ¯PÌŠ)äZ'ëÇ•mŸ;¨ ¶Ú+è¯ñv aº––ñ+è•þá›mwµÍ»ŠLG+¸¯ º¿ýg²UÖ²íFBõ `…FÉ:CÿýFÞ·2f™½Ö¯l׶ö|=û\„voí#x—%ÙJøȬÍX=»Å‡Ì[á^‚€dw«nk¢m,еGë;xÆbð´kW˜Þä~2_h®\¨ˆ¿1HªÈ²e«¡ôô”Ãl™fxcµ¦N¦íŠÏ†þRÌZÖÉJ ÜãsMš–Ðe¡¢s}jÐ=ü˜d8—èÉJ×V“¡2µ`#Ä{©êd¹g ÆÇÍ&¤·ö¼ÊÝ+á;³õwÉ.Ñr£kÙñ·æÝÓJdeÛ‹2dvùd‚” éι¸ó -·,ãÕ¼«²m¼U‹Ž«s°òŠ+U¶Ý~f¡Â}ærË„\£àòÌUÃ%;7-¦¢ g«Eûð\U&Îͦà-œK7•:nd…¼ƒö˜¶<öõI€÷N5!Ö{‰¤òa süµí¥BÁ¤|b *M(?m -g–÷¬ÈgåK]ÄDµ·ÛûþØ{×åºnkMô ôü㪤ª©àÌí_¶r9û”r9qÒ®®.MQ6;馨8ÞO0.ßÀ\sQÖºÈâ"½vÊÞô˜˜X -‘¿: -x5Œ%ʼoü¢°î”@ò„ÀC 2Á(r}ײŒC˜S̹ÒF&ì•@;oªØä|£dµ¹s„ðdµæcPÍÀʆ¯I=>¶$K@(´‚óæOrÙfÄsf*÷´€³:¹—Äb~·rR¡sæ{r‚Ò-D€=k5tÐôp9s^QdsD0e¯9±™®a >ÀÚJ48
h¨lXõSaeÞµ,„\ãj²§Ÿh«ÂÉl#i<Ä‹ÅþÒb@Ø@’×H›Ö'ÇuÐTfAb¤æ¹ñiåV[i+0ÊLW'„°tãQ‘˜”²3Yƒ_9¼}BPšŽš3òŒx®TW×ÛŠcuÑ«”màD ô:Dع2„àJÎöÁ `J3¢tPÈôm)qå3˜ß@ilu‘7TsA"†TÜ`¥ÿ5ß{åí¦Ìv¥m“X>éU…@‡ln„8ÕÓg7ºˆüÀ)h:€*Ó:C'*—\–E[)ç?j4,<Öx´„ˆ@]ZFÒÒK¢±”±÷—X#2vº¨©ö›ltýðAý® Éë^¡Àæ-qüYÚÖj¿3¢FúãHƒÜ¤ªt*.£ù9Çg%Ôlß$<‹|Δ2÷›§¦h"&ZbùS…¾k·iIÖOÕ¼æšrp&ˆól³Y`%
ÕXVhTÆŸM‘ ñÛT²Ÿ®¥EË¢êÚý´Ž½JVƒ–/o@ÄKfˆÙªÁ{Í¥Õ·bÍ^aëxG鱟ç -5”L§’_VˆÒAóÉjÛ$&µÕ5˜½œfä*©§BŒÕÁ@áue5ÂDÆjÞ\ -ûðQ9 -‘sÑÁ ;-&;û±b%È]¬[C‰ÒÕqaÑ–.«ª+«@]s"‰®ú:ˆ|ß+ƆÕÿ k_ƒÞ$Ž'Έò~EÝÕ¶š·FD¨ÆQmE+ -œ&«ÒHN ƒÙ}4®™ì³ Ò •«^_q˜‚Z9ùIb˜Íœâ}mï'N÷k…ü6ª45ÌËØ)I²³ ‰ÊbÁ>ª(‡³u%ÿ•1GQ$E!”å×beõ‹¶W8)ãòë«ÄÔø9™w±³Ád\éÂU—Œˆ -f?UÙ´ïp´;‹åOv --õ}Û̃µBF>M¬jtRE€‚ðCó3"¼%ùnmxÈ÷èäË‚XWý½ Ûm•ù0 8‚F„:]ô2m)ë¢T0`¢ -"ˆ -Š©Ã¡b¹D5.t…8‘ç_ÈÌ*’,§h.=ÖhØ3#«ÿ]ûl-¬)Ö^M„JÄzj®Æ¼mS[ -ƒjã©!¥ -‚²6ˆ8-0ÖÍÚz1Q¡Wˆ\ž
2ʼkÐ4ÓàÙ[!rÁi€’džk;™4œ8p½Ìˆx_qxæm"Y(üËêÄ¢<ˆ`ûšà=kkŽ¬m蜛32e,44)–7'¤¨P¢qÁC_m[+l8ÛÁQ¢¶Í—/©ÛØË…åÑÊ.€½u>…™ùbÖ6BZeõXÄ0K‰š‘ý(ðíõ@æBõðR€€ÚƒË Of†Ô¶”]P~,IJê -±oÝQ‹B«oq%²ŠjMâ’É/Ga4H»Ðê[ÔmP7š“êªaùQ6ŠDFƒ+¢â,ÎÛÖÙ ƒ¢JöB‰áV@ÆY¶å°-¥É¢â— %“'€‰ -Ä!K°’¨ÅÂEY`Cy:-Kù$*FM`Z!rPl‰ƒèõ•ƒNƆroCf§D—‚úvÖbÎf˜Ê’˜¥~ïª5™ãþ½·R®dEb`k4®
÷5(TäœÁÀêhÄUSà¼me"³…¢®×2аf½f+r;#©å´A¥ýÝlaLKL¦¢ØÐ{¼Iœ3
%(t³Z€+Ä~]b -‰Í -€f”½‘<2=óÔ㜈´¤Æ¼-
©"yéóâ´ôùy8#cž‘’æÄáŒô÷µ½—xï°Ö•Pþf>¯„Òéóˆ¨<µºZQôÈe[µvÌ¿Áœ8û^ƒ<û¶i–ðd»`Ø+VvÌÐÝf»+[mØ•}âbÏ‚<¶·IA³càfp¯v`a -×\!ƒÃRµ»
À‹i¬÷ðí{0oëÕ•ËB…fŒY¬Œ¥oe&WÚ¢Z©b4œrÑà!È5¥‡ÒõžÉ3 -IKoúÁŠÊ‰´¡,ÚšÔ?mWˆC^!Çy•ë¢½B¸^ù©!ˆ{ƒðž í³S;ÄûA\Qfä¡6P\*»CÁ ŒÓdÆSF(?U çm“ºú¥î˜äIN¸7˜ˆ)hYñyÛ¡:%¥¢9lj®“-"2Ò"jæÎXŸ‹(É7'ªö‡šâ`Q3’sÚã4#ÚI’í9këL¬™iµ3â\ž‘‡¶L¢RWª>à,D‡ËÚ"œÓ¢Ç¼`hÀ^‹‚ -YM1Þaw9ª|« ‚‰8ÌÌÛVÛÚavš«¿$Ž)¬'…›,Âi± -¢ÅDDw1ø4#Ú" -ï[m‹•M‚³$²0²ü -Ià„X2cfÏZ!2`:dýd -ouqÀœ)š+‡‘PõÛÌÚK6ª1 -²t0'#=Æ)ª²bg\!›ä -öK²Ÿ”6ŒŸúCrùÌì¡ä*u–#íH,Ë0»*w˜µÈŽ¼>'#©…6SXšˆÉÖ¦›unN&»X…½ÅÚF@ŃŒØåÂ2#J`¿ó¶#AúV‰sûý Ó•§Åõ¨W«TŸ€›«=ÃàšñþÑÖr¦ãšÄ¹gÝ$èÊ4¤pžSÌù)hÍl$}×¼%C(¡ŽŽ:¹WˆlùDƒÌÕq´WœÑ¢–„cèÎÀ„ê8No4Â'bV—ø -‘§Š%üšû¸2c½h½aZh¾¥ƒL%ÁÛ¢m‚¸æHì :ÁÃFy„>YÄ>'¾«sŒÖ@¿–í#J‰Y[’XÔž¦Å7ÑÏeÃ9"©¥'̤#~Å¡Jaó’b4o›Q‰gæ¦]!—î -î_Ëo˜;ŠÝPëçNeÎôt¨×®hb;Ê'ÂU=#Î}+d¸ÀG¯C÷âÌ8Tª6-Í’væ-yYQt\=Ê3¢*Còþ ‹Íít–LÁL´|qjIÜ̬ZÅ<k›Ä&פ®üÈ2.ùˆ]8Èà+D…D¿$y’JÃï—Az´ÄPµŽ¥VgµœˆÅf YÛ@øS-uFl’
‰@žÆ¶ÌÂUƱÚâòpØÚfQ5˜™çÁ53òÄ¡›Y!XFÈ]niJv€JZ³0 ÇBÅAðRËEÔØ¢ÏV¨ˆABÞ™{…*±äëAMë9‰”•ê%©›ŠžDÔ½a»ø›y Òq-€ª‹V:n¤ÉfLUg°+BÔQû²Y…±È)C䜌rËi-s›¾§¥‚šV -Ù.s¦×‰ZÜ+´ë)2e”QÖJ^7iÙGƒô£*ÆA4¼`6òQoyÌ~|C0÷ñ˜ÓÊÍEE¢¤æò¼Åèè…-ÊG‚!ä<ØìŠ+«¸4b®fHꄨR+åщ’È=·±Ï‰³¬Q3dÞ+ÌmÑ8 b -j»Ÿ·¥DÌËÔƒ¤î¾y¦T€,:²`ï¯J–TŒQÕ«4K¦m õqgmg§‚jÕ´ šgéõŠÝT8ÞÜG\M71òOÃœ8,¼ñ¾¶÷§qiz^X±Â#Ý„JšD¨'À(¢ja|JìÒ4‘@Á~QK6à0pù€zÕ(”£+M^o¸}FK*Ñ‘ -´‹Ü iVëuND‰Éà*¢ÜaÍØdvžjüÉŒ6ÒŒ<†Ov).V$ ÊpeE‚¥ç–ò5_ä()Ë2f¢ü ÛÌê–¬ìT…¡ éL£õÀ½YÇáôäW1—w.s> -èæ˵â—ÛÃLö…Na„`šI’2³mîΞ5Ük -8ô+óêòî/g—Ò¶ßyv{y÷Ý›‹»Í·Þ/öî|<ºòöfâùÉ}È?^Ü~{A+ùˆ„ mYÇSü?ß -ÍæÂíÍ!³•×·7o6?9ÜøÓËéï°o4msÛ¤´þäó¹½`pÓI½zuywù¯ÍÕ©ñ¸®7Ÿ×ùù»7ï>÷0ŸÙì•È׺¾8Û8ýåüìêü7¯6ŸÛxáÓ§Öm,[̾~þO<…M?àê[¤’œ]_¾9{°Ò°µÝi;Øfwþd‚a6ŸÉc³~ƒaÄÜ»Åa9ôcÿd‚a6ŸÉc1è<ý`˜ÍëÊ=¾h˜#†ä_LËŸ#æy|8Ìù“ ‡Ù|&ån=†ÃÃaå2ú„Ãø_J8Ì<ÿÐoâ'³ùL›Aèq†Ãl±³ýŒ<™p˜ÍgòX$¼C‡9hÿÏã‰æÙâÈmË<è>ƪ[Ä¿ÂÏö~¾j"à#ü|x üE¿øϯËÕG¾ÞÎòµ‘@ôx®¨Íe¤jÑ“,~¬“säh[p´òKæhOþÈÑŽíÈÑœ£ý"Ú‘¡:C» zägG~¶ ?; -hG~vägG~öøùÙÜ©óõv^ø'ÆÖ6žü/ȇw<6››úK>6OþxlŽÇæ/—ÿ¾¸úËÕÙ_o—xˆQ, ô©ëK¸“¼qô¤õ¯[PÎÞxLœïöâÍ͇Êk½B¿y)ŽÃ/öòÔÊŠøÿyp'>÷»“þÏçýïþÿ?ïNžZÈö±†ŠÌë‘ÕPyû=UQÙtv©†Ê†·õG/ ò‰§yyýêâõåõåæ.Ë~R/Îî~»Åu0{ãàÄŠõ¡¿ÙlüÀ#õ·™Ëc‰Õ?,—luvœìèU:øDó›7ßß¼íéŸß}à°?>Öð¡-õ¸f/ðåCØØLøÏÍÏÍ?âØl>‘„Í'Âü°ñD>0åùDüAOäžÁùDÒ#áÈãòÜR/xLWçÏ_7ðSÛŽo/ï¾{sq·¹¬ó‹½C‹c§{L -ظþÛ1#ÿ“¡5_ý¸yø×°É6ŸÈxé|"ÿ>ppèÜìæõë·wt$n/^mŧwæmtüÿÌ3ýe( -šÕÑ$þØLâÇ/=>‹¸;<“øQÝÛ…[¾£Â÷‘ÏÌQá;*|G…ï¨ð=¬Â·±€rTøµÂ÷TãÒŽ*ßcTù6®ÃñøT¾§vÔøŽßQã;j|Go›Â -OEçÛf&®õå'§õm1£G¤õý››WßÞžmÎc*ߣVùž$"ÆV9âž¿ó+^l¬þ+^|r†p,ãùS9V¼ØóRFˆ'Á›õ;–½¾ê‚¬€,ÿÇ7WgçÿüüDH7ߟ_Þýø[áÞÞýxµ¹[[úDßm -1ae‡²®ÿv{výöõ(‡³ßwj]PÛ1ßä1XCdjŸD=ÚC~áöŽœûâêê¨ëìy±šÛà~|+ø§Ï¾øOï¾þÝõ+ƒ"R&Ê׺¹þKï‚Ë”œ -ùË‹o/¯çžýé{íƒ}õã›on®Øvqòååí«_?s'_ôþñów³ÿ¹“ßöþüÌ=¯‘þïÄ=w1‡)ÑSsq’h›çEÿãy‹SðåägÏFPÎ?~ìÿñÿö?þO'ýp’Nþxò¿þ·;yE¿÷×g§Íçéy(S>i!¸ç©ôŽÞ¹Ð´Fäö<6ßN¨m~bNóóäƒ'bjÏkp•ˆ½+úëœ:HéyÌ™úMþy!SÛþšŸR$byžRLtÏs©Ôk -Ï‹÷Q:ˆþ9¿ÝŸ¶:qÃø¼¤ªDo=¶”õ×'?Múrz>Ejš\Ð÷£µõ¹bà9Õç)¸Y¥Òücykå¦ý¯©éô³öÙú: ÅM¡éËíyk -Ù»þMˆØ»Ï>1ѧjJô¾‚æ^žWÏ«ßÉaòúë-5þø¼¶”&!E7}»>o5Ò:õ5ìëÈ¿Ô—,õ‘¶LLLŒ}BbmÕÛøk(ôS¡/TÍMÛ¶Zx£ôo× -»Ô÷AɼMr_çvòâþ=õòÙ뾑cqµñþõSqþèÿ½lcZ-Úå-'ú`îùDÍ<ígÚ¡oÿ¾½OZ¾Œ}šŸ—Ì;ªÀÙ¥>ç]hC6&UÿÜ……˜sÑ¥ªýuÇK&?Ñú‡J1I—-;þz½aè[ˆ¡Ÿ‡¬»¼†>J^@ß×L>T‰tbé}deIhÑ?O±ïb~?Çþ[üUÜô<Ò¬dQ«‹4Uמ— ‡„{/ï÷¯¥ïÇÐ?Šc2}žªç©Ny’Õ/Eöiÿf½"“ -µ/¿ß×Ò§Àäú<dùýàe…xQª}ß ašd«ðúKý?Šì Ðû•ú¬ôôõ³ïôÚ7ÈY¡_Æ°Õ{Û©HÛÔÙ‹üX’µ)¤’ôPTc4?çôÕ¨#hÔŒ^åý>™I~©¯¯Í–[ /Á”„Õôãäs÷_¡êYï[R7F™¼Î [èÃ4a•¹3"ú¾B‘GÕ÷p›˜'b¿xöûÎê?ûšþq'¥÷/tºˆÅMÉÒýH÷ì>U—‰Ý÷ÅêÇçä_ô·¤ó2MA"1ç7ú ÏËy M ›¤ŒUëçÒŪ‡¤óü¬<"Zaî¢v6SäÛõsTo©Ú:oKʦ0U='à}f§ÒEì—¹ï¤V*wQú%1q´}p*ºzZÒó“ûò¢‹Ü7«Üº7ñI®Ÿ>»R‚œ lfú1HÑ5ë¢óÉåAÿÂY>k?9{ùT5¶¨›9§ ó¥ŒèËÑrÉŨ'¶ó„~ó6Ž¤¦N²b“·ÐÙ -̈eçšt»»É79D̆弴–ô`”>Bë"÷Iþ†Óå¯M¿r*Îa¥kÄ©ÚÇèCoÅGy@GÏG®Ìa¹_ï•™¤<ÙAJÓl%C±u@ë¾ë›°bÁzÇõ~‹×}RKµµHõ¹Ë
<I~î[-7e´ñFa©]–¨³½ý¢wñUÿçïýŸéäW¿>ùÇÿ 1êû¹,µ…tßáÙûèì}pö>6{š}Ì^fïã²÷aÙû¨ì}Pö>&2u‚U‰-ï½h“U@Ô³ÑÅœ>r¥Ò½ûRÉ9åAcäÕ>H"ÔƒçäJÌ"“¿9F•+»¸¬—89í¥ŸN£úìôž|Ö«¶æI;ˆAÞú½°Q¤~ÀTŠìÂFáåP•TMA;qAöné{¶Lºò.{„©m“Qôªˆ‚ôcÑc)H”»w:´¾)ŠJhýTuI†ÖÉ] -JöXæõÖºÎ] ñ¾é.ä&o@2–.¿’ÌþÒ´VŠ:¹Ÿé]#ݳUA«‰¡z!F:€/T ÅW!³4Íý’ޖݤ;\^×úZb’˜l€^Qä‹ÜYwÚ‰%:]£»jðRÉ}4^ÛÖX´ƒÉ5ý ʸ;×s¥éÖŒ¹ÿõBå·~ÚZSazÔ§jP½Ë†
Ï"<^/1¨Ò<y¿Òô´O×U<Õ”û'ÀÎix¿s…\ðå£èu˜BÀ–VE™ZvÞ¯D—£j[N´f&çxCvŵ¨[7¸âU(MU{e¡ÒɪA;è=Úö^uëöëm‚T['í o}]Á\{[ÑÍâóI8<)<Þ©¾ú¿õ˜4%nŠE—€N~¬~Y4¹c:±ËÄGôýTµa%-ï_u)ã:,‹•õÞêD‚ö§ «Lú>«Y/U-¿¼ô›Ùž ÄÎu0ÙœjBe2=8êÞ;°¦]õ…¶=^ ´è±¬¯vÑŸòN.¿¾ÖY.¿¾ÖX«~cT¶³2©.,|ÐgÑ«Ÿ¾kÅÎr©â»Æ~ÔµSº%±1œ w@;^Š>¶2©^MwKHtas—BÖ…ímïsbé -ÉüQ*#HtëƒáO^tÙä¡4ÑE(Èj -b°yñ>~(d¶09çõNå:bN)XmDª"YÍÎ\$ÁMV±‹
“KÆ7«>ú‘P1Ø·it$² -P¾TSWF¥Û.Wta*ŠÑ¢*Ã}°7[µBQi%zˆ0‘äBé ˆÅƒÉʼní‚D#µ‘QnJJœ¦¢æ¤0e]pÒloÙ>îœô§ú¦*~i}vÁLŵPc²×¯*ïò‰¼Ö…Á(B†‹^MS‹ï[Ê9±01&Š¨zw'B‚ -®_Qòbµ™1’ŠtÅ¿T²«A‡`Ô.qö¯¨ö3çD -ëMû¶Ó)ô“@,^>?Ùt]ß=³°k®ØuACÌ‚B,Aºð¦6tá
ãêr0®¢¶¬¶:lðNìŸB‰mRA4Ø2ö–
œ#°]OÅk–@dÉ»°ÈG¬o3ÚòÁú)T:m¸X¼š”œhdbý4ô“ÓÀRŠìÏ)•(!5«’†˜Kµ'éÌÈ„™!øÞU”³OvÕ4©«69x]T`NÈÚHȺ¿‰šrjìb´Š -D®pÐ^*Ù{Q -«Yç -)Ó"±Tž–¦ÊÞêïñ…ªà.ye©}õ¡ dú^v"kBì"‹vá¢N¢³¤¡Ua#«ÞÇÅPˆU5•E)Ú6ãbèk•Ø5h -;¤†úfnmþ¾ìCR#…Çõßj•Ío¤øb˜‚Ú$]Êa*ØIÈ]Qu©O¬a’«‰ïf"ÒOÀ‰c±k“ûŽÐnIG‚È€[¡/b›‚U¡/“¼ÒØ:/ãÄúåIqs¸îœÈž¾ Ÿ—á'‘úæ¯Pc‰œ˜svr¿Ë<¶§ˆ<t5GlÙ\Øz×i¬uà̸‰ª¾È†”ãˆá;3Udzbá4x_dU¶¨Ã¤Ö—³ðNôapï® øI‰Õ‰rWh÷zíw\îÌ¢“HðDœxw±ÿ:ŽÊ-mf*0î°NÌrš=Ë«P°Ðúñk5Úû]€Wïçd -ú}4/Ê1Ó‚7=:O,Ýt2³!v}K‰]Gí¼‘ nÖæ wn6ñ@drò¿T²â½ã•‘ÅÕIdµ±4%†(¡£‡©%myH“jæðjY8eµ·Éî&1UŸ²ÚÛ÷¯Ê¨¤‰”Ë–µÙ— û€•á¬äiªÞÈ]óÐ_#˹PÉÂÎ
n,wEלÕÐÑÇ[Š:è›9ûfàSìHßÂÚöº¾ÄÐ[V"é—è ‹E*ÁG5½w%»xq˜““AÄ“NŒŽÛØ¥ƒ&jŠ’E('-½É§ìû¾x¨î½%¶-E˜@Kg[$ðªm»€%“'†%²ëMõRÜåý¾¯sÚÎQºT#ÚJßö“žllªeé3„ÙFä(–{²qFÝ_ì±.0C·œ¡×¢×8®6§UØLÄ#¶ëp[€!ôŸèÌKUA7U¨Î¬ÊeÓ—A; ·JÀELžÑ‡û2Ê$Â+é“WÇZÈJtª’3·trß·EÈ•Ô—J®©öÜ{€¿æ)‚hŽÿ -ôÿÆÈfA§^<^ªµƒ
™Tm›y3‘ç -ýf±4± „Åc¨¹ld2mñ—JÕ‹Œ.m‚wV˜,Î3!vÑ
A}‡fŠj…ÉY5í"û]ÛªNÞ[J¨¡½÷»ÜÉ*ö Âé5AÌ‹ªyèKbhèL`‚ìÇKÀwÃK%×uqÙX Û™õp195óï9Q
Hv²š¬V®¦™HõRÉ1W„†`3‰@ã=Xz©gªsA•Ÿ\kˆìrÍk‡˜Þç²P—Ⱥ!þ
Ȇ˜œŠ¹Øt)dU>’éáD„}ýÿkÆ•°²8ó€-…—÷·&ÌߟÁMýÓýê‹W7ß\œ|q{÷çë¿œÝ}wòåí»·ßüíææê×ìÏîðyö™K.ºà|gÝ®¹ø{·ú^žt¾Þ9Mù]gSy\ømp9=û¬t1¾üιgŸ}ý›þS+Ñ´Ÿ}=#y0_ó.^}Mã¡ÐÈϾþ¼ÿ3<ûØ_=+æˆß-lQ/ðØÔBBÅ¥ªµ³ßÌ2ù‰YrÑŒ\lGæ÷ nãCW;|»ÄdM¤—p4£Ÿ²ÉѬ2cs"ožë‰ì—%ßÝ}û:ôðuy0+QíšÑÂÔ:‘],fdA™É¾‰Ö@çQäó>€LbçîÄ,6ItÀÁQLžÝZ±°Ú⊹֣…ä91„ËûæwÅ" -¸µ+F@§®ñåDDºµáÅîŒÛVñ*h[‰-èÄ)Y@eI²,$ŒÅ1 -i€ÖØ6‹*G¦ÒwÐ@öé½öú4áãÍ+ˆ‰G
Í<ù: -¬8™ÕlìþÆç -#GŒøv;±†¤L]6Ò‡tF÷#…4¼Tr‹p'Á©Ö‰SˆèW>Z˜9žÌ.NTµ PSØûYCàžHÏ×ÌLHšDÓù±cê -ÄÄOZÒt -æ'Æ’*‚ä¦ Ü¬¶J6‚Š SÕŒoÃû¤hÅRy:úk¸oÈÃ#<¢Á:U)€Ãi¯ÃŠÄä™^ª¸È¶Eé5ƒ%:oê<(iJ7,+§qY8—Õ?ìʼÛÑZý’ìá(
]¨3¦sÔi±ù^‡)¥¸ºˆïëTyr›û]hWf¬8e'–¢6†®£T-¹XƒÈXƒšðÃ6.%6óy„¦Ùb"ùU¢KXm$+aÏ:Ô<€Çʲs+ÛTìóÍaFŽû}ŒX›¦^MÖ”˜àô9ï‹ïgd]Ü +¾t +^^½ÿxûZošüðþ?‹~ôÿüøâò‹rSà‹é½õþ£r·D¹×î/þOy‘õu ¥×^__½|ùéí¯ž>ê
sý…WߺµŸÝÚKþ¯ú_ýßoNL&/m2yý‡Ì_/~ôã‹¿û/'&Mûï?eÎôÙ<u9‚Ϫ–²(W-õ _ÓêãyÕRˆµiµ\ÞÒêã¼j©(ÙÒ꣯ZJû¼ji‡äá Zö4{úxVµÔE©j©<KUKåßYÕR¨ç]fO]ÕRšçUKùf¹j©{+U-ogUKym®ZÖ¿»ª¥°ê¬j©¨jUKùž‰ó²Î«–²§rÕR(“«–ÚgUKéâ\µÔ.NUK=ÖΪ–r@æªåVúª¥Ðà¼j)`‰ªå¤© W¸t^µ”e¹j©ìJUKÅÛYÕR–í¥E¸‚Ä\µ”öyÕR–媥ncŒWšçUK}ëE¸ÒÎUK[§¯Zê²z}›Tµ”=rNzåjªZÊörÕR¾ÖYÕRöF"½ì¼\µÔwVµÔÁ™ª–ÒÎUKé³óª¥öuªZêx)iúôñ¼j©Ë¦Fø„›>}<«Z*¬RÕRÛ©j)í\µüŸG÷ë–î?ÙeÊÉ¢Ã¥ì— +´£Á} iq}ÞÖ-)®×bÌý²Îó’û:¬Š]hký¸Lsi¦D?[»Rå}»\ÞûúœönÄ÷£¤˜sŠïGOur|?›Cx¿ŽÂûuÎ +‚’zà.9¼ß-^ˆð¾&–[¤è~ªç¶mOÑý2‡]t!º_7¯7äè~Ù,f¶úmMê•›-¶¯ïë·ã¤Ø~,öè~/‡>G÷Ça•îÇb[‚ûcð3Yî×b§líqåsl¯Eµ³ØÞ‹6„ö벧«ñ5ל$œCû}¶ðßCû™’¯‡öëpÌç¡=%íÁ-²×¯ÚGöË´)°_-·n½%Á}`¿V‹õÀ¾^ÃÐÀ^ÌÓã,°—¡TR`_nlØ×uöý,°_ÆÑ<ì—ÙC"ì=YèC{O-´K™§ÚoS™ÏCû:&ÖÛï«W€µ|[Gzy}hoi{‹ìq±sªGöõt&…>²—ÔÒ +¬Öžd~“‡Úbß^í\L䪱¶|r„ä`[–v&¶2ïøB‡Á¶´‡#>–N¨ËÖÂY ¶Åøš- Ö`[”¯éˆonÁ¶ŒÞ2¶`[bLKM,Ø–¸,-ž±eÛlûË‚m¦˜l×#g#v¶h»XÁ—p[N^iZ]ȶˆ´,Ühc·‹m*Âm9¯öÁ¶È¤GiÁ6óg¶ëñU ¶ë²Ý®–X°-¯ñ+.l×våil×ç¦ÁBK" ˧m¯a·ÈY¢m韗£Ñ¶´×eŽh[úNj¤-Ú6oöèZ¢mísŸB$ѶšŸs¬£Ñ¶,ÓS:Û¨cm™[¸½Êô‘®´p[qòÏ"á¶ß9Ö1½pÙ»h[Ž€ÅjÄm¯zEþˆh[Ë-ÖÑh».Ó=ÑvmדþB´½º¦“£mY¶Ú°Ñp[6±ÙQ¡á¶È£2…(‡Û«ª;m×æ<ÚÁ¦Ñ¶:¨kDèm˲éØí(óV#úÖv™¬ÃDܦˆ¶¥}X*ªÑ¶`h›úp[–I(H¸¯±ìMÃmi×±GEù_ŒÝïMÓ”Få YŽ†Q™¼¬Q™Ã<Î=FÅû¶qbGÔ:%0*ññ6÷•u+£rêÞ§ÆQ™ÄfíÆQ9ì¹ÁT´ï£±Tšæ±6–ʲak,¢¥¢}ïcÏRѾí7– +K–©ÁT´ïµô0-Le—ÍcƒieÈbËLkˆ0»W¯0í{9¦ª}kSõ¾×=`*ßËI©4•c{p‰šÊîÚ}wéaQÃ¥@©ìÿÍw^ˆâúAéªÓ¦@©Ž`Ck Toÿš‚R=zŽ ©pûØ‘T¥ïí’ªõÝ@ªF÷\:ªõ}ìR,p@ªîµí” +¼É6†e¼IÛ~t"è&_p™JÐMw×pö(ÛD¦ÝÚÄ·]–=Ð&ž·kÚDãÕ‘êhÕ{·ÀPѶø|±Œ¶e‰°NÑ&j°@¥›¨ÞeÚÝÄäÖ#Ôé&¦7–cF¬npƒnËç$¥›˜ÞúŽ·Ú–I>™nuQ=ílA7ñšåªxS{îè&‹d®4tÓ¶¥J7Q¥G;uÝdÙZJÐMÌîi:oÒ–Læ›ÚßÖ™zÇ6œo˜ß™oúÞ–XéÞSmÛ²&å›sd¾é¢5ð¦ïâG˜àM]÷aïø¦Æ¼Å^Ê7íMc“òMFȱŽßDô.öszì/³tø¦#ož:¾éà´ÌQMý«,k +áT®,kG8Ѻ7ëÄM
Í©€…qbB¯v†Æɲb‘¿BNn‹)ôx‘ön퀜HØÅΞ +9µ®÷–kÛØ”›} +”“¶^‰wʩȽÍåT·P)§ú¼åÔP· .0'ßÇ驘Ó}65Ή;Y@ V¾¤éVk†N:ut-‰Ò©Ê»èD÷vˆ)èÄ÷ÞËÖN|oºtbë¹ÂA'¾÷2%Ήì½Í[pNdï}X‚s³NÈ)çDöž—58'²÷èa›pNåÙ€ +:m{šâ ÓEˤӷ™ ºìÃØ‘Nö¤½J:íÎiÒÉ™–¥#Œ¤Å°¤¤›a®“NGÞ´u¤ÓÑ9Nš¶UŒçm™:Љì}Ìc€NÑr,:=&,
Ðé2Ë‘tÚ¶í*é”EãØ‘N·[¶ ¶‡-H‡T~F:»·9“n’¹»sËV'Ÿÿë¤SAÓ‚Ä ,+ûî¤óÙkrB:¡×>[øé'ªÝ[ËV¥=n}¶*ª÷²·lU¥kù”tÚûtU·kŽ’nÒ9r[NÚ«å+A:•»·–®š0>éTS·ø.H§vûØÒÕÉçHC:1a·¡OWÕ µeJ:±n§%@§ŽîÞg«êòZF«¤Ý{[¶:Ë0#a#ݘ‘N.:
t2ÅÓbs÷UƒtC#²’®>¿ŸNft.-]×{å5ºúfûÖç«âzïkËWÕm¶*€®x3ƒNk+-aÕöØVõ§íDÖHW—ÍCKXgùLSi¤“.KO:±OÇ–²Æ6 ]‘ù¸}ʪïm)‘N^cù‘®´ŒÒÉ¢¥¥¬ú6sKYUnï9Wwä6´ŒU;Ó¥œ“²yæçd KËX§ÃæÙÃ9wSŸ±êØ´lYÆŒ4¹¥¬“ü¶ÆÒ§¬2Ä'+(è”,GËY'W2èt™U
tÚ^Æ +«æêàY,_n˜“©vÂ0'`Ù·†9i[¾Ü0W¼»À\ñÜ Ì¿@™9§_Æ9‘Á8oœ+ž ÷œu^š97òäÎ9ik¶n SÓÅ +´Ç k”yЉ£+ó2éDå,¹UÒþ3znÔ2Ý;Ò‰ð½7Љ|ì-qß{KØÞ~9GA'¶7D–ƒGloCtb{¯sË\Åöž·)@'Ž2×' +ãÄÝ÷~ºJÑââŒßvI9«è¹ÇÖOWWÜY'¦·ñKW¤êâ׫A\]F襌«m9ãÄâ.eNŒ[K^Î8ñ¾§½MW‘çyÁ¸""[ËYEóÞ=vÄÕvÅW¢H)ci³UTÚ¶™'Š¸Bò‘W¨°8ã + Œ3NTéÑòÓ€œZÛ{›R$·*k@NÚÅ/S9Y6m¶JlÃ!'íyíg«è{Ïc@N_ãWÑæX§›¢‹¦6[E¥ó©ÍV‘¯'Nq†œ˜ÞûÞf«hŽc@N†Èa×rE~ tnÓU +¼uÊéÐûé*2<w›)£ÃFÊéSÃ\mÓÔOW‘Q¾ØEÅœ‚ekÓU´mÉr`NËd•sFš-8§$úé*º¡MW‘¶_ÀVÎi{x6]E³rëÂ9lNspN~¨ÔEáœØ—ÇÞçâ~{Én?ÓE>#ÂýòT ñÔ‰õ½ØYEüª‚ç¤:9&×–¶n2svn¨“ö`ˆ +ÔÉf÷Ò®¶ÊA;í:ªxF +çǨ¯{ÜZ޺ɴç¥Ï[å඀:ÙeemÕ9c÷µ¿àªÅÅ¥åús–S›™'GäfÜ +ÔɼÂyl"Ù;-o•:=Ž>š;˜6í¨“ ÇNKCÌ8/ùB„xÜÛØòVñ¼a²¢nðI=u¦¬5Öé=O–ƺ¡]¨Ö
þ3°Nj|V0Ö¯5fÖ©>ÝòVm—–·–â%ÏÌ:±¶÷–·ŠÙ½•¥±®¶—aéY'¿¶5´¼5¶ëtfq:ykË‚uò’ÎÙ]Þª‹¦–·ªr>µ¼µøOzu¤«;rÜ[Þ*Ý9>'?¢8m=éêHòû%(脯[iJdà•½Ï[¥:^¬'ƒFŠéÎS]ϛϚ Ðír)ÎVQÐ Y¶]pÝÍTî@§¿\ÚWEÍÒ@'(<³tu™Ï!SÎízM¥]pÝõl?Ÿs.|ºÐA ÎÈž½r°%$³Nu%& «rL‘¼†’q§2ÈaÄVÞ…ðBÉÄæÉÜÿešÚÅ×°A2õÐA ^è `/t̽ÁÌÙ6Í$tȇ’É×tG_ÓAœ}MIð„8„8$Çyø Äylè!„ä@!„dÖ…rY„–˺B*‹B*‹’SY×AÈdÑA(Ù¡ƒä’:%;=¬Z&‹Ò•ì܉’ç5TìÜé*v/ì§ +©„gø*6Ym'FǨÞúÆgG¤’E³Ò¥g—Jê29_"•ÈÜÆb? ¢c¥½L!èiKçHš¢R‰´U±p©DçC®½V"Ëvsru¦ƒÌÚñimhäïë¨V¢ÓÈJ D^£¿žåZ‰<?l¡n¨V¢{i«Dvâf–‰Z%²£×¶ŠZ%ÒrBÀ*Ñ qc «DÚ2c…uÄщtö³dj•HŸ»ŸV‰N½,±ŽVe,éUµmhd„U"íµéj•,òÛƒcH%2\XÅnä"cøzsžù«DŽ+¬v±JäØ”k¾ŽZ%:¹r©D&8î&#ÍÅç&Ná"©TbwÍ™C*‘-øï¨T"Ó7åÃsÖûûì³ý˜‚Z%2ë“ßdYìþ?[i?á V‰ÌhÔ0Ý’˜9êV‰Ì,ݬÃdÞR‰¼drAD¤yº‰e6sJ'š#ªR‰¾Æn™|¥@[¶«¤C©k%R×J¥î•t(u¯$PêfI ÔÕ’Ž¥®–K]- –ºZ’YêfI +¾š%HÝ,¤.–HM,é8êbIpÔŒ਋%çÅ,É”C-r¨%P·$S·Ê™]ãÐK2ã\/qè% ½$!»Äa—À8·K2â°K@v ˆÃ.ɈÃ.qØ% Îí’L8ìçv‰Îå’Ì7—KÀr xC.ÉxC.oÈ%à
¹$ã
¹¼!—@8ä’L8ô‡^áÐK2áÐK cĹ^’ ‡^â„Ã.qn—dÂa—@8ì‡]’ ‡á°K@vIfv ŒKÛPÆa—dÆa—8ãK`rIfœÛ% »Äa—dÆa—8ãK`rIfr ŒC.qÈ%™qÈ%@»Èa—dÈa—@9ì’4´:’)‡]â”s¹È!—dÊ!—@9ä(‡\rN9ì’L9ô(‡^åðK2åðK † œC1ÉœC1t(&€Å$ÃÐa˜ +ž›']Ï‘¨à¹y<7Oº +ž›'QÁkÛ° +ž›'] ÏÍjx.žD
ÏÅ“®†çæIÔðÜ<‰ž›']
ÏÍÒZO"Úsñ¤‹ö\<‰hÏÅ“ˆö\<É +öuÔ:ÑyHÇÚÉ|Ø-”\;‘I9ÒY>T;‘eK»•‰lÁoè£Ö‰Lt’©ý18íg¹]¦Z'Ò.{»s ÌóYÛ½ŒÔ:ѹ?óÖ‰L²š°PŠ¶ÕŠôu¬Ãê7ÔŸVsíDÚûÚî(ª‹o`•‘Ç~eÁioc»s Âlšÿ
¬“£n€Q—N£.tué$0êÒI`Ô¥“ÌQwN‚£îœGÝ9é8êÒ 05ç$XêÎIf©+'ÁRWN‚¥®œt,uå$XêÊIÀÔ•“¦®œL]9 ˜ºsÒÁÔ“€©;'Àç$ÁåÄaŠqM1N2M1Nâ×¼Å8¥'¥' ã”bœd”bœ€R7Næö/jœd’bœ@RWN¤'¤'€ãbœdâ‹ +r˜%@³$C³È¥mln€ˆX’!‡Xä0K€fI†f Ã,r˜%r˜%@µÈ¡–dÈ•V"Èa–@9Ì’L9Ì(‡Yæ0K2æ0KÀf ˜Ã,ɘÃ,s¨%pµ$q³Îa–À9Ì’sÎa–dÎa–8çKàbI&b ¤C,tˆ% ux% ¯Ôá•dÔ¹Xâ¨Ã+ux% uh% Ô¡•dÔ¡•€:´P‡V’Q‡VêÐJ@^IF^ ¨Ã+ux% uh%Ž:·J@VIFV ¨Ã* Ô¹UÒ¡Î’@ÝИ¬¨s«¤C[%Á:·J‚uC»P¬s«$XçZ ¬s«¤c[%Á:·J‚un•t¬s#$XçVI°Î’Žun•ëÚ66ó?ÊÙŒ¤’@Y%AºÒ’• [%A:·J‚tn•t¤s«Ò¡•@:´’L:×JtX%€«$ƒ«Ða• +ÖÝ)‘ß2Ó§DÚ2·ÛWÑs–,sDi«`áN‰^€wiÁ•Y´%”¹Ê'AJ‰|›kÁ•ùÆã2‡R"¯‘ÂJ‰<?„¢F‰,ÚÜŸ£Dvâj†‰*%“O‹ñuT)‘¾Ð;"ºRRÛ:o¥DÚqÃG×A¤;÷e¥DºÜoR¢JɤfE¬c%ÁÁx”’A.ymÍ)‘ ¹æ”HÜïŸe³ËðÓëèAJèÅ*ª”È…ÄclJ‰\ÓÛŽ¦”ȹÇýRL))2#~jJIÝã‚z”’båcÀ”¹ö=%§¤HæhNI±3@ÏY·³ÌI))6.”’tdzPJdÁp4¥¤øPJ<`÷uL)©ßSM•’b“C))Ù)óySu™ÞJ§D^s,Í)‘½öoa”$Œ"”€QŒÇ(BIÆ(B‰cŸŒâ“dŽ"”ÀQ„8ŠP’9ŠPLÝ(¥%™¥®”K]) –ºRÒ±Ô•’`©+%ÀÔ’¦n”LÝ( ˜ºQÒÁÔ’€©%À£$Ã¥˜â”@Sœ’LSœhªN (Å)I(E)¥(% ¥$£¥”ºRIQJI1J ©%€¥$ƒ¥¢” +:wJ2é\) Ò
d#)%è\) йR s¥$ƒÎ’ +§D®5íksJj[0®« •ÈNÚ&•;{„TRln›¯cR‰\.k“JŠ…g!•Œ6Ó„uT*!•HŸÛ=HL*©ï/µ(_G‹‚²Lø¶
Ý>RImk¼ÁûhñµŽÏ±9%2x§XEßFO[¬"R‰ +ž‹'QÁkÛ° +ž‹'] ÏÅjxîD
Ͻ“®†çâIÔð\<‰ž‹']
ÏÅÒZ÷N"Ús喇öÜ;‰hϽ“ˆöÜ;É +ñDŠ;Û_DÅ“q2{ñ¤¶kâ¿…y2Ng·‹°ex3º®_q5Ü<{éd¬h\vœ)™ÊÝ pN´ÌÊ]<Ü9Ñʬù"êœhÙUwN´šë·‡Â9‘Ò«D¹8'ãdI!ΉÖYñÜ9‘/[»3¤y(H'ZËZC½v¥<F:‘¸áœÈ>^Ú*êœH?èÝÝ9©mf8'ÒÞš×±[…W+b('ÒÛ~UNd4¬í#Zg7æÛ6ìö"*œÈ˜[Ö9ÞEµi~¡¬Â8‘Q«7ƒñÉÉZAœÚ:bœÈÈ?¦5Œ9ž6“nÔ8‘crn2Œ'R¬œ†-”“Q湘ª4ÛÓÚU>T9‘UŽ=Œ“Ñ'}bœÔ¶Â?†å¬›ÑU1NÆÕŽ6Œ“1ÝíãDJ¦3aœHmZo
àÆIm«éëXw-6½åD^#£ åDžéÌfR „$àÂ8‘—¿«‰LÆRÍÿ÷1éêÆI Ô“@¨'BÝ8 „ºquã$3Ô…“`¨'ÁPN:†ºqHM8 ŽºpÒqÔ…“à¨'ÁQN:Žºpuá$@êÂIRN¤.œHÝ8é@êÆI€Ô@Šq2ö²‰ƒ×’âšd’âš@RuMÀ(®IÆ(® Å5£¸&£¸&`Ôe(Šl’)ŠlE]6qˆâšdˆâš +9Ô Wö¡’"C9P@±Èa– +9Ì(‡Yå0K*å0K j ”C-©”C-å0K fI¥f ”“Yä0K*ä0K€f Ã,©Ã,r¨%Pµ¤P³Êa–@9Ì’OÊa–TÊa–@9Ì(‡YR)‡Yå0K fI¡b ”C,rˆ%•r˜%¢b ”C,©”C,rˆ%P±¤R±Ê!–@9Ä’J9Ä(‡Xå0K*å0KÊÒØ–ä0K(Q.©D”Ã)IÊÉ)yQnËfBÈ)è9ä䔼('§$)·%‰ƒrᔼ '§$!'©$!'©ä9I% 9I%@NNÉrrJ’rrJ’rrJ*夃$夔$夔¼('¥$)·ö¡EM(yQNBIRNFIR®JRNFIRNFIRÎ’ãd”$㤔À8”’Ê8”1£Æa”TÆa”À8Œ ‡QR!‡Qä0J€FI…F C)rRJ +ã0J`F ŒÃ(ù†q2J^Œ“Q’Œ£$'£ä…8%‰8%‰8%qJqJqJ^ˆ“Qâ$”$â$”¼'¡$BINBÉ‹pJ’pJ’pJ^„“P’„“P’„k™ã]‹CxærÉÇv£$F „“Láú¢×ƒç–VÂá’@8\‡KR‡KâpI@.Ie. ŒC&qÈ$•qÈ$0™DŒÃ%©ŒÃ%q¸$0—¤0
Æ¡’À8T’Ê8TWö¡$—ë~!N" „Ã$p˜$•p˜$“Âa’TÆa’À8©$‰8©$/ÄI%q°v-`á&Éq2Iq2Iq2I^ˆ“I’ˆ“I’ˆ“IòBœL’DœT’DœT’Ê8™$É8™$ɸ–}âãºL’ʸ.“Æu™$@®ïÙFLÈu™$@®Ë$r]&I\—HäºD ×%’TÈu™$‚\—HäºD’ +¹" ŒëI€\—HR!×Ñ_¹.‘Èu‰$r]" \@®Ë$©ë2Ir[™$@®Ë$éo‰D”ërH \—CR)×]øžZ互 +¹.‡Èõ3IìïN—CR!×å +âÐ?@ + ˆC!©ˆC!qeQFÄ’Ê8 ‡Aä0H*ä0H€ à ©Ã r] + ”ëRH*åºQ®‡A互 +¹.ƒÈõ0H`\—AR×eÀ¸.ƒÆu$•q=×¥€¸¾g…b‘yrˆë{΃;⺒OÄaTÄa€8I €Ã p2H +ßHà |C ©|“A"¼!€7’Š7ø†@ßH*ßHà |C ©|C o$ð
ƒ¤ò
ƒ¾aÀ7’þ–GÄ7¹#à
w¤â
w¾áŽÀ7Ü‘Ê7Üø†;ßpG*ß䎀7äð†<Rñ†<ÞG„7Ü‘Š7Üø†;ßpG +àÐ> +8Ä +9Œ ‡2äPF +ädŒÀ8Œ‡1òɸ4F*äÒriŒ€¹4F*çÒtiŒ@º4F +êRu)Œ +#•y)Œ +#`/…¸—ÆHÆH¶ïdŒdûNÆí;É"´ï +Õ¼'WäÕÀ“+’ØpE²ÿ*WäÕÕt_åŠd÷U®È«û®Hö^%‹äd‘×d‘¢“,Â\‘×\‘¢Sw†:¹"u„NšGŽÐIÉ:©"¯:©"9B·öá¥CBy
ÑIÉ1:™"9F'Sä5F'S$ÇèdŠäL‘×L‘ì¾JÉÖT‘WëNª;™"Ùº“)RÁ‡)øÒ|iŠTô¥)û0E`_š"~iŠ@?Tè—ªHÁ_š" +ò–E|(¥·”EìHŸ6qÊ"v6‰A²ˆõÙ¬¢²ˆýÛ†4Eìßö¨ùo$‹ØU²{‚,bWÑæ»°E¼/¹~㶈ņŒ›í¶›c"l»wýXUMFt[è"öoUq]Äž‘çÖò´˜Ëîìã¶6óÂH³¼Á£åßñ¸ÏóÙÆ*QboÏßDwºüÄ|{ŽgS|{ͬу/b¯áܲŠ¿’Ös·dU|‘6£®’|ëèßÈ/òE|0 žFlªÓãˆ
–Xg%ŸÏÃ÷sFµ÷EìŸ[¼lî‹Ø˜Ë±j¹/b±ç³”¾ˆ'tü‘æÿvQ¿a¡Œfc;ø"öoká‹Ø8¯ë%ŒXÌZ’#öï+ +y†•ó¬ÿÿà‹TJIJ¤²E^ •-H%‹$H%‹¼H*[$I*[$I*[äERÙ"‰ÓÐE’¦ÒE^4•.’4•.’4•.ò¢©t‘¤©tp*[ä…SÙ"‰SÙ"‰SÙ"/œÊIœÊ§Ø"§(#àgžâŒTžâŒÀSwF€)ÎH)Ê0E¦(#¦(#ÀTÊ,E©,E¥RF@)ÎHE)Î(Å¥8#¥( TÒ$•4RAŠ4Hs)ÚH)Ú E¤h#¤X#€kÊ©Å£X#pk¤‚k¢$H¥¼@Ú•5’•5òâhX#‰QY#‰QY#/ŒÊIŒÊIŒ†5ò¢¨´‘¤¨´‘¤¨´‘ŠbÆ!À8¤1g¤2gDŒe¡ŒTÂÉp8# +7Ìà†9ß0G +ßGàâ|C©|;פ€ó
qÀI©|Coˆ# +Úµôƒç.'çd‘$èÂ"yqN*Ir®'ÃbÁz¹$•s¸$p—Ðá’С’ +:é$pΡ“Îa“À9l8‡MRI‡Méd“$èd“¼@'›$Aqt’褓 +êJ@B ¨C(©¨C(u% ¡¤¢¡Ô!”€:Œ’Š:%£ÒÉ(© Ct(%€¥¤‚¥Ðå>:¤’J:¤P‡TêJ +êpJ@N ¨Ã)©¨Ã)u8%°§¤²§ÖI*uH%uH%BœH‡SRI‡SépJ NI%œ@‡SèpJ*èJ +éK b‰H‡WRY‡W"Ö¡•À:´’ +;¼`‡WìðJ*ìä• +ÿ,»J–ˆe2¼zVOËÄ:ÉÛù¶L†×öêi™ŒŸ +R,@ºö Å2© Å2¤X&€Ë¤€4-4-ˤp4-“àhJ&âhJ&¤)™¤)™ +RI&pËŽb™TŽÊ2£X&`ˤbËDE2£’L¶—d’ E2¢H&Mˤ0.51.51.=“¸ôLÄ8‰&"\Š&…pˆ&¢ €C4IÀa™ +8, +áR2áR2áR2)„KÉDˆKËDˆKˤ .-1.-1.-“¸´L‚qH&B\J&…q)™ˆq)™ˆq)™|0.-“¸ÔLĸÔLĸôL +ãÒ3ãR4åR4)”KÑD˜C4sˆ&‰9,0‡eæ°L*ç°Là– œÃ2©œÃ2sX&pͤ‚ÍD Ã2tX&uH&°ÉÖ!™TÖI2uH& ɤ¢ÉÔ!™€:I&•tX&ËÒa™TÒa™@:,H‡eRQ‡eê°L@–Ie,P‡eê°L*ê0D@– ¨Ã2©¨Ã2uk:,“Š:,P‡eê°L +êÒ2ëÒ2ëÒ2)¬KË$X—’‰X—’Ia]J&b]J&b]J&…u)™ˆuX&B]Z&ui™ui™ui™Ô¥e¨KÉD¬KÉd{Éf!™ˆu)™ˆu)™|°.-“ºÔLĺÔLĺôL +ëÒ3ëR4ëR4)¬KÑD¬C4uˆ&É:,X‡eë°L*ë°L`– ¬Ã2©¬Ã2uX&°Í¤²ÍD¬Ã2uX&…uH&°N’ ¨C2©¨C2uH&É:I&/ÖI2IÖ…d’¨“dòb,“dݕź°L^¨“e’¨“e’¨“eòB,“D,“D,“êd™$ëd™$ëd™¼X'C$Y'Ë$Y'ËäÅ:Y&ɺ܇X'ËäÅ:Y&É:Y&ɺ–]–d– ¬Ã2ua™TÒa™ˆtH&"]J&…t)™ˆt)™ˆt)™Ò¥d"Ò¥e"Ô¥eRP—–‰P—–‰P—–IA]Z&º”L„:$“í¥šÝêû›’‰H—’É'é°L*éÐL ]£· Ã3© Ã3tˆ&€Ñ¤‚ÑÐI4IÐI4Y “e’ “e’ “eò,“]X&É9Y&/ÎÉ2IÎÉ2IÎI3yqNš œ“e’œ“eR9'É$9'É$A’É‹s’L’s†çL*çLà’ C2© Ã2tX&€Ë¤’ËÒa™@:,“J:,H‡eé°L*é°L – ¤Ã2©¤ÃtX&ˤ’ËÒ}éd™TÐÉ2sX&pˤp.-q.-q.-“Bº´L‚tH&€É¤‚ÉÐ!™ +:$@‡eè°L*è°L +;,`‡eì°L*ì°L€– °C3©°C3ì°L€–I’ °C2vH&vH&ÀN’ °C2©°C2vH& ;I&/ØÉ2IØmpY°“eò‚,“¤,“¤ÝÆ”E¡,“¤,“¤,“íd™$íd™$íd™¼h'C$i'Ë$i'ËäE;Y&I»Ü‡h–Év²Lva™$ëZöX’uX&°ËÖa™TÖa™ëR2ëR2)¬C2êR2êR2)¨KÉD¨KËD¨Kˤ .-¡.-¡.-“‚º´Lu)™u)™Ô!™ˆt)™ˆt)™|nY&uK3ë–f"Ø-ϤÐny&ÂÝMÄ»%šà-ÑDÄKÑä¥h’ÌKËê¥eöÒ2©ÜÃ2{i™ +'Ï1Œ;tG%!«ÃÛ¸{âSh=, +—Ož-võüg²Oìj
ïÅt-ÞoÏî«È‰ü(Šœ<ß„ß«ÈÉóý ˆÛVm¦¯ñô¤--µ,ròó©ú%QãÄÆ2f[ŒºB&I”1 B“Ÿí“°í°AÍöC>é–3·'ÝFç÷ud—¿_G¦”}bßUï½È>±æÙRŒ‰õø,åºR?±Ê`6"ýd÷–Nƒ>ö¡Ÿì.©Ÿì¦ÿ´w“=J²aŸØÜŠ¹}bãüû™/Û'»¥©¥mb¿Ù</
û¤»™/CÔs´¿vÍBœh5¡ŸX.¸=_ +¢€` +¢€` +¢TSSS¥0˜‚(0XªÊb°\•7ƒe«,KWI㫼Œ°²¥ª’ÆU©ÆUI»¬’ÆVy]% Œ¯’FX)ÆWIKXI +ê²HŠP—ER„º,’RP—N„º,’¬Ë)vY#E°[»Øe”;ìÁyØ!¯TØÉ^uØ+°{¥Â{Ø¡¯ +;ô`‡¾ìÐW*ìÐWD;ìh‡½Ri‡½î°WÀöJÅö +¸“¾íÐW*îÐWÀú +¸C_ùÄúJÅú +¸C_wè+wè+Âö +ÀÃ^©ÀÃ^xØ+{¥â¹°r¯v–I)ÈË2)B^–Iò²LJA^–Iò²LŠ—uRó²LŠ˜‡À’ÐÃ`yQ‡%±‡Ä’ØÃbyaOË–KRƒ¥Rƒ%©‡Â’Ô“Ãò‚KB‹%¡‡ÆR ‡Å’ÐCcIèá±¼¨‡È’ÔËz)¢^ÖK)Ø£^Š¨—õRD½¬—R¨—µND½¬—ÔËr)…zY.EÔ[»êe¹”B=DQêá±Tê!²€=D°‡ÈR±‡Èö0YÀ&KÅ&ØÃd{˜,{˜,žD¨‡ÈR©‡ÈõY "K¥"ÔÃd{˜,{˜,`“ìa²|b“¥b“ìa²€=L–Š=La‘ì!²Tì!²€=D°‡ÈR±‡ËöÜ]ñ –À^VL)ØËŠ)Â^VLö²bJÁ^VLö²bŠ°—%Sö²bŠ°‡Ë’ØCfya%±'Ÿ%©‡Ðò¢FË–.Ëžd–ö6Úd`/l–E=é,oìÉgYØÛÑÂ^-•zZõd´,êIiySONË¢¥S ¥S*õ(ö(ö(R±GÙ°GéaÊ){TN{¹aÊ){rZÀž”–Ä^£KS°'§%±'§%±çNËzrZz’Z€RK…RÐCjzH-zH-‚NÔÃi©ÔÃiz8-P§¥R§ê!µ@=I-zH-@©è!µ|=I-/èIjIè…Ô’Ì“Ôòbž¤˜'§%™'§åÅ<9-É<9-É<9-/æIkIæÙ,÷ƒÄ<Š§TæQ<æ©x +È£xJEÅS@ÅS@ÕS +ò(žò¤µ,äÉky#OfËBžÔ–żp[Þȓܲ¥Ö’ÈÃk©ÈÃkIä!¶$ó0[^ÌCmIæá¶$ó[ +ôp[zÈ- =ì–ôÐ[zYEEÐË**zYEEÐË**‚^VQ)ÐË +(‚^VQ èe•½,¢"è]ô(¢R˜'½EÈÃnyØ-yè- ½ä¡·Tè¡· +ﲤŠ€—%U¼,©R€—%U¼,©"àeM•¼,©"à!»$ð°]^ÀÃwIà!¼$ð0^^ÀCyÙ]’wØ.•wØ. <t—¾Ëx/ <Œ—ÊKžŒ—äÊKòçåÅ;¤—ä]ÖVﲶJá]ÖV𲶊€—µU +ñ².ÊZA?<Ž ^–V)ÄËÒ*"ÞÚE/K«â!½ô,Ǥٸ ÎK%ÒÄCzxH/•xH/ëâa½Tâa½@<¬‡õR‘‡õ"ä!½À<¤—Ê<¤˜‡ôó^*ó^€ÖÐÃz©ÐÃzzX/@ëåzX/zX/@ëèa½Tìa½{H/`é¥réî!½À=¤—Ê=y/pÏR™#[!¸—ÕU +÷²ºŠ¸—ÕUĽ¬®R¸—ÕUĽ¬®"îey•Å½¬®"îá½$÷_^ÜC}Iîá¾$÷_^ÜÃ~Ùð^’{ˆ/•{ˆ/É=Ì—Å=©/oîÉ}YÜÛÒâžì—Ê=É/|²_ø¶œë(à“ÿ²ÀG™ÀG™• +>ʬ +³ÎŠ¸ê¬«ÎJa 0!¢‚«ÎŠ(˜…VWa0
˜ä`*0/"Á¬ ,˜Õ +âÁä(Ÿ<˜×(ŸD˜å““£|a^£|a²¿+&[2a^?™0Ùú“ “?™0•ƒ˜0â`Š0€0E˜JÂa@¡‹01•,L¦Âðy´„‹C´`* Ó‚…iÁ +vì1ˆw¶0Ùž¿ã·õ9ÖiRÔóï§A›‹Þ[v˜ÿéCëäožMáÎó O.™ÿÀE™Ã/™aØIÙs¢köü·Yy\3olÖf9òšÙĉqͺ%lïçëšukxXÖ‰®Y·7ú9®Y·¶ÌsÇê5ë6{l×Q×ÌÆ-E–kf3&—Ý«rÍl,ÝÆß¹f67c‹Äê’Ùþ>çë’õ›rͺ
Ž3¯Y·‘Ì>êE{þr·¤ž³®´.še +ök¼.š=±f—y*±ÕN܃¯§½;±4¥%^šq·9KË[ŸÞ}ø±ÏhâþìÓ,vœc4GàtCËFecÅ~ŸÇ±YŸyæªþžvÿ\ï +S‰j{hQ—\>ÓuN½ýÏ6Ï髱١\~ú~ðÞ¤2´+ªÌg–:Ù/ëFÚŸ>\úhÝúg=’'ž70+ƒÎ!qbS5 3)§çØQp·ÛrµqsѾÄ}ê‹ö\ö‡‹ævWÊE³Œ{G¹h»ûË-/šåXìÇ|]´]hä¢í¦)ŧ_4›Š÷ìàrÑ,wáˆÙ<?”=tH.Únïãq¿.š=D– ÎEÛïHLä¢í—žrÑ<Á†uÑžS=*ûEó +÷ÁEsÎ>G¿µ™ÍF¿gÌJûíõoÿû¢ù3;ã‚ØÈžet;fåÿ´_¹{‹u«›DÎËF$¯XĨSžÈfµ¸¢M‚_6IYݦoY6³¯ˆúü`\ü䲬ƒçÝõ‚ Þö°bÏ^/c›9¤”ûð>G2¬¢Áu1ôVGìÿ¾Æ¹]«õ1OÿÛ6ÕpÃU]o}ø$ùƒ‡cú.…uKjÑ +K‰Æ’¢>Îtæeó’_—ÍZHÖbç²yÉ>ͺlŸîl!=áºyÉ—Š‹ëæM¤Ù^׫¹Éuó6’eEêºYi¼®Ú¿ýí~Øiÿþ÷ÿæ?üþzz|÷tú~ú)ÂÞ=«ÿá‡óÙñ_þô?þýúßÙÏ¿ø‹ßÿþ¯~ý›¿þ±ÿ˶ÿäùÿîøûçÿ¾úcßïy_짣?M/ÏU:vKÔ·Qé_ŸpsµÙžíýÛ^¶¯;ùpîä÷~xÿã>Æ•ˆ¯ûiúøÿ°Ñ_,cŸgx¨ûÝ}€ìyNïæ7W^žÞÙ7GcíŽ=Œ×ÑX8–LߟÆÌf¹Æß9%ÛÉ×þÖþƒÑÑR”|{tø•°©Áî6d`·´_ž +¹!3ý¢?7G^ª§Gavz³tDІ½bvß=ª_òp/o#ú0+…Ãϱ‡m“NëDZíÏeAŽÜµçnCu_´˜Ú¡?æMh?2Ûúî|‰Cöú¶^þܯ„·Î²Õf"èuc|Úu +êYpÓµ´ðÜth^†W{Õ•Ô¶ß=Úì–£©]ØH^ÚWyX+ÒïÒl>á+îó4|Ý;›^~}æ«âû^ãÏ)šè¶ñ1ßë°™²ãÌ?×á4/UGpYB•÷Ȇñàƒá¡ë°;t¶–¬‚Vc8‚síàµöjƒ¤¿hÇà{O÷§§ "îEÄ„?ß¹(þl*vç- H{ÌËâÚÄï»»¤qUì½·Xö«Ì4yv àµåï£éáãº9,ëh+¸ñ=á“`ž§çDÅ#þ +<MÇ¡˜O!<.÷‹JEØ´Á¯ +ß'÷ÐV=ô]\nšÇ Øú6³å%u± –…ýWº±Ï‹ôUáëæýk·û=³w +^{>nÖfe¿Q#0¯í?±×±ö:fËDqC¿¸¶JžŸ-²;Ä[ç[^jiXøä#sÄwÖzI¾,„ží“^[kð|»ó÷ *ãÞÍÊçлï¾×³×›ámãAØomëÉ麆AÃÛóQhÛÜ3;Ø/¸gÒ|ÕÍä™omy”}î_žü§´NÌ5Óx<¶c׶ž•ï‡µ÷"莽}1:vÐö#Ã:Þ·‚×\ÁxCFxxyoÛÁÛö|8Úv|ÁLÆ’1ö$^·ºÌ>kÍSÛ]ÀŒNp¼ùÖ‚8¹ŠÃ¾œjDyîÏzɶqr}ç-?vbgÜñ§±Ô¯£l?ï¥8g°Ï–‹÷ÎRpƒ¼¾VíxOÓûE¿÷ÑRíˆëb_E…Ds#” MÜ—½€kò§Ì7‰àÓóÓµö§[Áã"hOaì`{^¯¦Ë•-ý·’ãÚÜÆÔýïsìùkŸbã‹èk+vÿ~ßîá¹ù±áPÒ£mã^Û¥MoÎHñíº¶ónküÜ“ /Â3þ¼Áeh{×·ÀÚñ˜lz¬¯Ó&óY‹÷êù˜<M!]’§QA“ß6kz±®=ä‹#Øâ+gãù£qúMpëS€8åéó/˜?Ô±{ž÷Ó<Ì.—Ý@ÿD>_³ÉáûÞãs:cJ5þþWàœÑŒŸ«rÚ:ëíÙuYΑ£ ù§‚ô¹ós]ªu™nüøò5sµ¥½›+ØôŽ×Ì‚ÛÎ!]|Ÿl
¢l“ñöž–KÄ!m=Žàðµu'J+é°•79Uÿî~U+Å׉Yo@ÝÌP3%>œà,Ž ŸžQQ8¾ç¤©gË+˜}vÅïmiäŠüˆù2²zƒ¼²#<¢[¿·æ'æ¶ëO}7¨Þ§.÷¶ç¢D¯Ÿìˆ¯¹-rž“‡-pc3ig™{±ƒ3]ºå—šÇ™MØgëlÿÒ9bk³@œwrHÇp–gÆSæâÏõJ»è¶´Aöegt¬l+Usé<a_àX‡÷ËíPF/|¹çh)ølíß±‚_Ùi9—ñ×öl1¯ï†É¾9R¢¦¥é™9¨5(ñ°ÞÆÕd¶&¾âûIïàÌw!ï®OaÍ|o¢½¿†IÛ×T°1<é9äüœ¯ùË*Øî^. ‚ìnÖqˆÞÍ¿•ÝiàÑzòéç•Ï·û«ßÞV¯ÍSÎ~ò>×£¸(ò°§>D‹¨ënãʼeæq
î©®Ü^ |L:“ã ¾œZÄ|-«nq±<šîø5ó°Zéúü°¶K3ªµê#Ý}!yëMŠÓÝ®ÒCôž¹ïw³UÉr\óÒÙ>Ñ=ÇV/[µÕ‚>_›…tM,®Ëììö´¶3}´ÁlÃfÃ:]âïífWŒfiŒâ=-X(~Ï–…wzhÞgˆ½¶˜hŽpP}Óâq\£\?·!¸/úùÓø¾8Ùh«Xðܹ
w´‰6[ö“!´Ëš±ƒ-’$ôxÅÌœÑ>Œmc +îyãiþΨöߪK²µ´YÓëWÂùéó~‚‚2ûÚd?ý“]¾—ݲÓ=;jfs +búëáåw?Ä©zÖî°¶¢/èÅÇ懵ÝljÃò.þð–âŒËgWÕ~äWê´iëïÖ²~>8lÚRÏ«%WÚ<žŸ€+G:ËÆo\¬/ú½•©Šëâ.Vœëv3~ï™iþ´Í-úN“çí߬gf³I~±xÚžcñªSæ‚}v#.—µÙí.údð>o=™ÞuFøšßžêü¨yVþk·V€äêùേ½¡Â¶Öf±)oŒ×ýŒqtœÚYpDò–óÑÒoãØ}ñ'ßPZ[œ§§,ùyúºœv¡4åA³³àŒnÂð‰h»»~õ|¦yø¶6vbCq¥MJõ3ð×Ò‚=Ƈ%øòÔ_„<+œfáÝ…É¿{eŒ°ÿGy`í†zMÊæ¯ÔŸµçבÂìŸ5?ú'hÍÆq賦Våö|jÝý³uâ)±OÕfce6Jïâð–ávm‘¤ï{‚÷}¿?&†ÄÆ«ñ ÷Ù‘'h£¦¼Jž³gM«†vòÚ7í µ3Ì÷çÓµÔh´§¸MeDûðŒwiŒXç)¾vOÓÇDó8³£ÇçúŽ4¾W_÷/ˆ°^›iêr|†wƒã¤|xæwjpû²~Mõ“P!/ÿ´û_ˆKÓmôkÀµW´¹Z¹Ýué†u;g‹OÝ°ñŽSÏ£‰çÂïãþú˜‘ª÷Ä×¥ž¸fŽ_›¿è—îo\1ó>ŽíˆSðñ¬¿Ô·ÎµV?†vñªŽæïïP†ß ”º“#¤e?\×y÷x}jò»O¨ç5zsÐg¡ŸÝ·‡¼Efß>›gÂ=ª¥Ùåí±jú´ÿ<ýɾšÝ`+ËeK ø嵬ôçã*âÜÞ"Û|Ñf‡ðíéÄÛCѵ˜d{n63Žx][¬hhýÏíy·Ë{Ùwüšú]Ñк¶AÕw`ó/žÍýœùh‘/ça_8î„7}¯¾ÀÜ_ê®yœoëõ'£á£Ë{Y2Äå$ó‰¨+szÂøêF¥Áf%
ô<Ú3æÝJÛÖÌN÷ˆøý*úü˜_ÅÓÖ°´™g`YÆ{\Ú£µÔ›&ÚÚm8̈×ay%ßÁœ1fk‰ÄŠÑ„öÛ´Yx'#¾€~Ç]&v +A5mçˆqüh-ºv¸‚q +3²Ê_ÛîS½ù×5¨A_lœ¾cü8‚û<t½"7þÔ}kªã²DWvà™#f"ÊÜラ‚}Îã› »´ì`…}õ¬÷»bb&‚ÏÓ¹—`ì@¹÷¶þÙÒ•uí?¯·ˆ¨½E–¿§v¸m"ž_çí<ÁM>ŽÐ}"Ì
?u¿<}ƒþãÊ–-jæqËþcóa7N÷YcÚçzöúV˶yàq•à/š…{ðÚö¹³> dAæpJð.’W¸1„e™ƒÓgѶ+ŸûS:,9¯Yù¹í¥ëuEGO]-ý©/ÚÛ$Öx²Ÿ®¥ƒyPßÏí%ÿŽ5«_[ÞQÄÄc›^Î;Öznïð¡Þmh65ÚºqœGÜB¹€þ佶åïpK9:DfLBj7§&lþWq´^‚'\·½#çÎ÷écÑñ EGÕÿM‰Ç®hrx8²K<³ìñA± -ű‚ìÀ‡?·É¢+$¿C¾dhþ˜4„÷VýÎQfÓb^éë3x[n6?'lÒq½·í›r’ýòÑÔWûõtA?·QˆwX–\(B¯ /à<s+ÜÔ€>41ì“x1ÿáÁ½ùu²%6ŽãÎèùMŽ)„WÐÆ'¶}çWØ«Fp÷Á¼ˆž–HÐZ¼]ÓFé=F²Ÿ‚gôxÐKR¼ƒšMâtW˜V‰¯Väl±!崙m‹ÙM›ÆÏÓ=|„¹í‘+ó~ˆ»Ä€ K±Ÿ|/o8;ír㎘U0·Å¬ëÚöÜ‚Í‘¾ò2‰?ÿ +_z:Ýߊ+Æ#èkª¢ÈÏ[¤kØ<ìqñ§¼)àÁý¾¿‰ù®ùûûXÒçNýÉÒŸŸ<nž#þE;8Ç~êÑÌ3
”µ;:HïàˆÙë<}…g´$#èstþñ•7„yKßzÉ_€ë±×Þ¶/Šày2ÝzVÑG2N훂tfº¤¼·lx]á[¿_ß+²àâpb*©yMÇ'ÁH|…궧™ƒb…¯;AO,]A>ú>¶õÞ¶wR±2ØæÏZÚó3ìsü +žq—Æb`
ní.GprGoŽ ¾CÊÒŠ˜/u›1~~î‘)U·<"Çv &lͶ¡ÇÄ3ÅQ*™'-ûQi8ÎZHžXè ŸÎmkõDxÇ÷剰þÉyé~xžæO‘œrºDŽÞŸ"f?ÞÙÇéA^È2¶½'ùù´òu“‚O]#zûE£“ÓG™ë–> Á§ãˆ±`Ë»ÚòÑ5ã]A½Š3Éoc/mÓ%ê:¦Tn%}I½Œ?¶Ç+Ñ,!ì¢/ë–“²?V‚œ[,Î×+ÚVÆÖÅ’ên¬±¯f9Äýc˜Èšj›€3L4â¶lGH±q +r]cäúc[=mÖb·‘ÞÏà•¤W˜Nºíu÷˺Çö%ð`6»Êx˜¦¡Ø¥ÓÚ”lðt$°ƒ×sO†F®Ù»øC´)Ÿöã¿Ö…ŒYW{îì¾ÿJtWìÒjä9ž“Ûû¼Üym<Yÿ½íµÊã»ræ0"ÁÙÞì`…}É‚ñ,Ûz‰wîÕ^ÌàM?xpM. àÉ“ÓSç‰0ž†ÛþŒ2ë ]á˜)ô Õ*õ›+ø%¦‡íþ´!¾¶uik˜YAËcÉò#ßr[á2Žv¶+ßh_-ÒeÏ™YóT‹Ã—QÖù,{st¬Rʶ3tÉh%+¬àó)ŒO0˜wpä ÏíyðȼÓÉ·×®À±´‚p\ZM½‚>€› ðÐÚ~Z×—kÊ9÷ëâÓå‹K8”}cÑc<£V†uO ÕWáÜz æ +%|‡'ûSŒ¤ç'Ôç#¸_}” Cñ¾Vã{ÛM3|Neˆñ˜-®Ò +Gp¡šfñ+xŠð{Í8‚§×«¡ƒ~ÇÇÂzTzCät½Vù{Û=ÖbŠ ¯iÉ#1°j5®öÞãžCU¶TJWOÏE½èn0$Xƒ{Tèøû÷"‚ÛÍ°œ—àŒ¿4}B%ƒÀ½ÝçǶæØü1_
ƃŒü(˜7lïŸÛnŒ°ÛƒÞ+hýÓ¾nᦉ‘¦£Ý®;ŽUAv@_ðµíÔõöj/Lé4
>)øy +¯m÷¶iÛ;§#VÌç‰ø} s
[¬ˆïDô¶ñgp:7+lÆTóZ!Šå n7b–`>†>ƒö±íè1™à+ +o3LõØ+³À÷ZµÏæNºÛ>¼IzⶓaDs)¯Êº[çI°tFÂV„wÖF&.ÐÙÇÖv„íÄ{0¢Íd-1Fã¶hÙù\×ÕfËà ¸åd†ÖÁòp_è1 е@LLŽC¾ÑÅCd«˜FãQ¦Ñµ^tñ57o¾ï `õ7붖êÇ Ãë%Øc˜5v°Â{ +–S¨á©nÙîÒ¤½œâ·ÎÇY‚Ùìûù±5”|>Ãl˜ÃªÐ`¶£spe[®ì‘„WÐW‘ý¼6ŒÚÉç¹Ç®·‹‘šW°¯±†5ðá‹clz»˜&³Ä|×”š5ätoʶ¶÷ÔÛÅ +`ùpø‚qq^Gv¯øc–«¡é½ÝW5ž%Èè8¶ù±m§y¸i§ÏàyÜë¶ÂLýØ^g×À‰Ë}÷ps¬¥ÁÅñ¹º_ ŸC9{,Ø£Ïû +öl÷]«‡¾fšÊ¶áþÖkšœ¯ïã,É
ÛAot›5j¬
u +öKXýæìÜþÕ_üá‰ËÇGâò¿þg%/[›Ý?Î6;esîÎZšw…¿¾ÃMé_ß;ùðÚÉïÿHëãk†|ׂÝ^&r‰MäŸøÞ1ëZ9`Žf&{ìd^xYýƒíA_ ê»<žT3Úukk/cé×ó’âéã
=ºõÕŶѪخ=ò™<èÙ²_|G$°EøìmwÆF¢Q°]¨L>^²ÅêPOø,šÜ®;Úß#&Zý‚™Ór¶yrmŽ¡åìû_±t‰‡Ÿ£½_Wg3‰ª]^—f"¸«“3b9ÕØ,]„0ž ¦ü¼HúÅz$‚5M—äÎ;oðÙµ/+¥‚Û@}qm¶ˆ¢²JãC\Á+xÐkúÆl±z¯‡ù¦‰…_f´uÆbâl™×2b
ª=äA_#>öû„·KæCñƒ
T>,êÁÉëQŒ!_;í 92áÕÜc§gÔöCÝbYà07uƒ†¿wJŸÿ}œ]×Èßû*ðzd¿¿fü~j!Aú"z´qïØÁ%…Çÿ–/±êA_ÎÕ·ÝåêØŠ¶GŒoÍøŒ²ƒÑò´)ŠÙÊA÷Î4O×.n™q¶ºÚwŒšÆã£la_K)Žwlk¿êW6-ÊÁXZÂß1_@÷ ŽÈŠÒ _<IuR)Åûšb·· *Õ.|Y5^ûÎ[Þ÷Üíõþk±[©Žë¢EpO:³T£iB»?îÖÆ¥C˜7¸zjf,ÿ£;yê|ÍJÊÑZ¼ºÃJŸ“µ˜ +jÎÂ>²Gý¼Ï+ÍaŽ›wŒI0kÛv0—shSåé[ð8aÇœg°ÒZ¬`[<5Ãü̶³¦>4›ÌüãÕ‰ùζ7žƒ€ý°œ±—«;ðt¹aúˆXðàÕÑtÖ–:Ÿgd‚h9Œç}sa38›w7/ÁÝ&|=>š³qP^©QW€§h\ñ¨Ç^#‚‹“Q6ÃâñS=®ÜÁ9›mãá¶uŽüÚ„/d[údu\×Ô´-[ë™-µsY,E‡“ŠÏ¥…ÎÎÃrgl±{Þë×û$iG“«œë}û†üŽuL±ƒôj´m;ï‹û¿Ó¶w#™I+>™ÓØú‘ìPL£t¶áqðΘ-×nó÷t)_ŸQ¿ žrËæ¶óÎÛdàO¾€VñG š<¶ÒÄMŽÓ®Y&‹Þ;à“O4¨\ÂiKwŽ½ 0v`/“&F-ø´³¹]‘c`Ác{}¿ØsÖu™Ñ‚õ?7OíBcþÇæäÊD¿Ò÷{g‹Õ÷ÛxdùÞÏžèÕ<²Õ>”{¥œúا¡éÅv"èSCâƒ.í“”qiòõž]^fÜÜëжʳòK
?ÛA§%æ2iìÀ²£ó«¦*öŒ½ÛG_ÛÞyÏNI·{æÑÌÈÜc¿>È©ËxX)om«z6›¾«k{ÄZ‚ëÀ"È:i> «ØóŒòùj4-|ï\™È!±àú´+wÚwºçtÝ›SŽ\„ÏØö$ßßw°ìãÎàuæÖ#î°UX#“jŽElh6c’þhÁ«sË=—ÝzM ÷Ñtì æý/AîíÑFîàjpâTÛ¬ǽ)è#?ùÒg¾ô¢‚7·Æ†|·ƒÓ-ØÛÅaÅ7e">ÇSp¹ƒã˜º4sMzÚiÎÝœ‚‰ \C>›Rq¶®÷æ&]Ôk&Œà?µç{sËó¡›ß”ß +šÔSƒã•·iáãæc£1-ßVݸ™A6Þ„Ñh¿O¯è«ð‚î†Î{Õº)&©5¾!žY–[íQSx;A/_A_SVW–Ɖçúñâ]G`àæ
QŽïuò†\‡F&-ì5gc¿J·3ù0a]»m¥ÉãI¶Þ#·°“(m&&rÒºÖLŽà~“ KÍ昱¹‡½Æ«±_E)+6ŠVÌóxb·.cßtð÷ÎåÓB#Í“By€nšK–oi7P(ž¬:uôQ +*‚×ø†›~LÉØ<øÅMcÑ· /lg¯õÙ=ŒÅ0éõûNÎþÐ8£ï 6šF¾7EÏ •D³ðà[æ7É[·ì`t€ì…]¿Þ§2¥*µé¡ã®W!‚[¼1¾%—vTŽõEЋÝƃ}j9LÛ©
ö±ƒ#¸£^Í'\ÊõÛö¸©ïÛ°J³ò|„|.]›=Šµ¯»£à}äÙÞcí`Nå°w‰×Û‘ù#"¨7Ž')vpdŸhƲ˜?ùâ#rºúFOË‚G¾qw&ùœ/8^…‰n÷8øcºà¹902v`‹‘ÂïsEpËæïœe‰ó$jÝKý~òI¹”/ù{¾x±è„}ÔV7a›¹ƒýbc(¡Ì”Âs¯ìŽ °éC•/Þ)£3¯¶;íåŽ)¸³¥¯_ÁX1ÑÞ›]›jÈÑîìuƨòÊúJÄïµ½ÎVÏá©|±®‹MK|莖¿×”éê'XЖnçoéýHçÒwzì¹_W}Qæ«Âãœ|=bŠd³FÆΫAÿ;Œ
øOb·3rôAÐÃ9KÛÆ[£<£³k0w½62Žëu +7V×;c=3ý¬)¨£µüÄ©ÆòD‘;Y›“e׶çkw²%ßùëï—ÍÜML#¥{›fœúª+¾*|ìhV>ªÁ>»5RoÁlN¯•(lÙÑ8õq5•ersNåU˜:¶½<s±{Ïötgz£í|®Ê›ggÉIÓmnh§tÑÇÿζ_ çÓÌÜš»‘àS£Ü<7f\âa¿«åɇÁŽá¢SqkUiûS9àèŸdv lguÌ€Ùä÷Š,?‚|!õ{WIkËÕ‚c£¦¯×Ò â‹75n9OÜü´éž[îøNÃçäkãa¾3úÝTƺ?¸1ÔÖtáëa´ä‹QßSíu2LÒ¿³uà +Š*Sž¥&.|¯#A¢<ÛA¹„míÀëë~O² +¯;×ÙùýÓXá +¦“§ g¥Cq¡<10»æòl·ÊUø¼ µWH%¬ÔX'Ê‘GsÈ÷Qsk]‰öþ—Ž´\ÿ,i¦!o|@RÿŸñ7kebÅö-Æ“Ø)ׄ/¸ýù>K«E{ðùó1Ë<¤Nk}_€vËÔ–ç4³£3æ:§žƒ `ûÐ’h¤¹XÖÖ§/ã
ß¼HÔö\‹ñ‡¾X¯7À‚ù®djŠ›ªÙ[ä«lºôäœZ.ú°™.ê•£gnëËs"ÐzÍóúå1]úâþõl%615>o†Nž°Ü†k¼v ƹƒm2ä}ª$ç<s +ì÷¯!}ðc-µ4C‡a«é€Š/Ì]ÚTQ +bæÕÕWÈFô¾Ã„aÀMcä4œ
ƒ(ìŽÚo?XW!îãí¶âÉ1½„5C1.'{XI$6ôuŸZù‘šñ§ +¶å5dDçË*.–Å‚žæÓ3?Å â 'S[ˆ¡Ñý*Ï6^ÖsDV±
ض‹óÊÄ'òըϽ†®öôÐì£~3^¬Å´}¯çZ’™†ÇýLZ}¼“e§ï™~7+ÆzbkN–dó–zLZŽÌ8¹s]›!ÕB—÷ZSø´™LBæÀÙ¬w.îº3ãfKêFWÔ× ]‹Ã½˜¤µuu»Í±3›S>¹Ž‡ª/ô£<4´ôlžzãqñék2—VÍJ¸s5Æ]…žcù8°îI]á]EK,Ý q +x5wÌ[~U˜Å#ïXŽàÐ~éô3ìÌ9'Ë™P£îŽVÐOž´±Þ›\Å´¥¤v¯ Ž'ÚsUó\‰{c×V²Õh¼u'$ÁÞ‘¯J*‹¿™±[Í(x·˜ z§Q±º¯ÆÅX5ûÎ)BšPz¼NêBÒ1¸# "v0²orÇ +N?½Þ;ØŽ|ºàœÃ…§Þçss¯Æî¢g½Å®”Ò¯¤½ +›žŽ¶–Ƹ×R²–w™7öA빦ÙMçÎW˜ã=ÈVC[’ȹ_>d^_™ +Å’îO.SÂÌ[xfú›í÷d¿ïÙÎt˜îÈóŒàµóÁÏ_ìj-Œüü“Uåü1Öœ™¿v—ò$Û‘Âé½\[Ј‰ójÖQå·jÛÊk¤„ˆ|Û"Ìq +¼Íòe%óFÁy2²ÝM%î#™gWáŸüE¿§ÖÅ™fš×á£ÎWÀrÆ¥7¾¦?;¸.¶ÍÂÒgfI_±ô¬ëÚëÈã;̬‡²íüYqŸ±UÇÉ^€°£Êy_r«¼"P¤`R_lfò8·º¦Ø
cÁ9󻱑5¾|´µ¬¦%¾gîÆΩûi*ì$Xk;‚¾ƒ}«rÊÚV+'ø—RcœYBýUôa+ȾV!#¿ªúZ†÷ÞJŒŸk¬li4Ðz)óæܳºÐ +N4\¶ò»}T*K^½ ²ä¿×¶,9°jèÙPèÎxÀª¡gIË“aÔÐóµ¡IѤ†ž-þÛîúDØ8}T’ʪŠ¶ 8YHÇÙiùü~’ø>#Árwe)û‹t4³W9ÎEÃ{ð9jµ Uìç]Qô^-5a·Šý” òùá3Ì‚³>I3vPfÁ&~˜Ù«$ë”mm%@&ò2uik9°W8àÎ ü;j¿‚ûª”ºÂ×*ü|gvÈ+ÈHÀUVb·É1ïm¯(C}ËXeñ\U³Jx€¤ãΕñrUž(W›KìÔÓ¶.Æ ƒm™avÑ#ÿ]+FäXó‰–Åæ#[Y¿Z±¼æZžmmyEžæ{—¶8ÑTpiõ«˜g;£;ö“fè²råX–.«`À©JôÛž•Aö,u0j˜‚C«š¦õl‰ÑÔmû¨Á_˜kÒ`Ûý"5ÍV#>ÛGìUÅh…K£Á‚øµ2ÑÌl˜ZÅÈSö(G̶–€¥Ò-«ŠQ Ö*F%¼×Ô´½7-²œHûBt5§`|¢˜oÙvÓ¨VÏU',‘Tƒx¯ÎGÊÁ{dòý¤©Ä®E˳†è ±O›p@ë¶6¥ÅbèØ.+f«ápWt‹Vÿûd·,€iý¥h þ’=Ç DÙÖ*ŽºZý%xÖªÖ+<²=e™ˆ')–Y†i”fù"ŸTÓªÛÚúø9x“á3èÍ‹ØA
g9®ó³ŠÒgÐ;Ay&óÓ§8dîc×ZÞ+˜ßTù½eÛ¦4k‚ýªUJšF¡F)H"S˜Ô½©5LXÚöýc[[Æ/žªU§h·EŒh#¯šFöíW‹¢l{F +uÖµS$€ŠÞ{ù€š† eüzTÙˆ Ëß´ÈmŠ D$/ ßεƒÒì¾|r<ÙJðñåé•:žŸZ›C±Ã¢wM5"Ë<¿®a½ò!!øõƒDã;V
±©•½tT•õ—“ÊNOkõˆ µ%^Áçå_„#<j¶¥-Ö6V”hø;Kð
9iÙ§ºíiª®KCÞÎ +^?¯’Y+zÄTV¼²[ŒîÚºVªîáU‘.Üj…áKžÝd®FŠ¾r +·\BÆ×rð®Ê¶±ü}Ô0:®ÌÁÊ+®TÙvû™²…ûÌâË„þoöÞu¹ŽÛZ}½ÿ¸*©ZT +Wq‰™K§ª2¡f»XN%ÇbÐ Â $ä¯ÁŽØ)+‘nB|¸f„2t² Ÿ¤o¦ž-¡°ˆñD(¼íª¯;m£KJ,È$ æÎâ”ÓÌ +(¬°hÍ!jU= +\”ªñ’©)žJ„ELË:,ÚJ"5
3X
…é¢@ERbÇÕF ž/B™Ôj:œUáô–M6 ^Å("W§¯k´ì€Ýo +ý¨D|œ"&y[¨ÎDXÓ™*'k~-ý¾fSq•¯†±H„ûÆÿX€…emˆÉ8£Èõ]ò2*aJ1wæ¬Sx´Ú‡cÁ~ —àK%«ž£‡G«C?Õ¬¤øŒHÊòù“%Y‚EL@`œ7ï’㨯0!žë¤cÞÓàÎêò^³yáfä¨ÞCçÌåÁ[ˆ +kè êQsæÊ¢¨çÀ°=#rÒ=:2]Ê@ƒ€í•hp!ÐPÙÌêÂÂJÀkɹÔÕ€O?[ÐVE•É¶Òèˆg‹Ý¦…‚°$瑶lQŽk¤©ƒ¤I<t#âÓÊ7k›0ØL'‹°¬ãQ˜T²3Yc9ô}DP¡ªš³õŒx®WvÛŠ›uÑ«”tà@ðuˆ·!2òhKÀ;•£íƒhÀ'Dé “!rX´¥¤v–Ö`Œ¥²
FÞ4RIIRƒÅgÀh.x'ÊÛUYï¬m•8?éUEB‡Lo´¼8ÕÚg§º( +q(æ +¯+«ñ&2VóíRˆ”pñ!Jü!ŸaõÞ͈œ÷ˆ:Ùi¡ÙÉe+‡@ÎcÝJ”¨Æs‹¶tY]YñšIÕ×Aäû^ñ7¬6]û'Q=Ä(ïÔäš·Õœ6"jµ5ŽqË*XÁà4‘•FŠÈqªÌ +¤1Ïd
”õ‚ø܈Ý0TóÉÔh†á8ìk»Ÿ8îÖŒü«8VÌËô) ²³* ‰ÊbÁZªˆ“u%o–1GX$µ!äå×b‹eñ‹¶e8*ãÒìsâQ~Jæ],ÄäE0é—ŽpE&#"¦ÝD‹†rèýç‡`Fäâê°™v2?TáÐŽlT·Áä§ +:à+ìÄNâü£BK‹ïÄ:ñgÍÈȵŠš T +^Ô¸m#b¥lñ¬í ßM+ÕÜ$kM>m˜+ÛæÅTMŽ68ÛÅЬF„µQn¸E[WF¿Ó+ˆeºÛÉÙ" + +êp(Êœ¨Å¨ÐÈ£Õ눚!y4Z¯=jôk'b9뀴Wk[-7ºWö«ÀÂÚrÎàÈi¨ˆìߘQ롘+5rªAÝi£‚§HÓ":<Å»&m§D+S9%ö0Ê)Õkö§ÝŠ’ÈílGéP•ˆ%ÈÙ +Ç -§: *‚âÕNˆŸS¥äIEK04NÇ1(oiK#¢òb´æYË8©žV‘);%rÜ/Þy²T֩׊ãB‹ÓíÊYM¸©‘³N‰j_"*uŸØ”Xc˜ìb#£²<Ýê£dé¤^Y0’™çWý´í0>o”‰s¢›tÐÉd0„›‹“$4F†o•öäp8¿jgm5ó£<mNÔòËØ…Jö£ 2"-¶ËÞ\O:°àò¢m +-ÊÞ’ë×…‰.RQ¢ _S~¢ÌF¾P1©ézÈ%1N㢂l¸`‰3¢ï{eJ¶H}2âê¾5µiJœ¨a0§#¤' ™™&A`ëDœë&m½˜F„¨iÑ3"—nCŒðBÍ4xöfD.FmPrŸ@wtG“†#‡±ç ï+FÏ´C\c`YX”;l_Ó½'mÍ À±¥î]„ssB¦ü… +ã¦Èrçˆ$ +A4Ž#Xéó¶¥ ¼Á6³<H·yö%‘{c¹°<ZÙ°·N§01_LÚV^}(b˜$HMȾÿöÀ s¡zxE@ +®Ëì”ö’QûÎÚÂB̹
c^“Ôö[“9À{+ó*!W$Ö°Cãºñx¿“Q/ˆ’CÅQAÎ,¬ŽFœ›§mc/!™,0uFdÌ_tÐÉ@Êšôš¬ +ƒõƒ
»NGI±ñâ:;UwYRÍk@q—N$®ÇÆŒ°3ÊåˆyŠÁAËÔˆ´ÀÆ´-
‰#iéóâ¸ôù¹;#‡4!ÿ(1L‰Ýé÷µÝKÜ;¬AEÙÎ+¢¬útT¥š¯Ö zä²Z;¦ß`Jœ|¯Nž|Û8I²]Ðí³Óu·ÉîJV7v¶A\ìYûö6)hrÜ +Ö£ +#©`éM?˜ ¡œVò¢IýÑvFìbðŒ<L+`gíÂõ짺 î
Þ{"´ONmï;q¦ +LÈ]m ¸Uv»‚Aù§ÑŒ5¦ŒP¶ªEOÛFuõK1É“œpo0SÐ’ãÓ¶]uŠX%D=rŽÓ^G[Dä§
¨§;a}n@¹¾)Qµ?tÐÉÐ;‹šè”œá>Œ¢$Ùž“¶ÎÄš‰V;!N5à ¹kË!*U¦ÀβYA´xر¬- 9Éa𘂷t
ØkÁP!«)Æ;ì.§•E•oe¤C0‡™yÛ¼f§™ûKbŸÂŒ<*]gNK(—TýW‰`¨\Ó`ÖÖ)ÀÝAÄàã„h‹(¼oÞ+;fIdadù¢@7±œÆÄž5#2˜:èdýd +¯eqÀœ)š³ÃH¨úm&m³%„tÕ„8êt0%#YÆe)±2³3ΈÝ&9#Ã~Iö“\»ñSH.Ÿ‰=”\¥Îe¤‰e fW墖ܑקd¤¸Ðf +K1ÙÚt³NÍÉd+°·XÛΨ”›\˜'Dé +sÛ`1µÝOÛR¢æeêNR“ß<S*Àt=°`ï¯J–TšQÕ«8I´¦m Õr'm'§‚*•¸ šgéë™ÝT8^î#ÎÓMŒü£Ä0%vï°¯í~â8!.Mϳe+SÐÓM¨ÀÉ +åèJ“×+nŸÞ’ +v$D@:Ÿ‡Ièö„ìM‚2OÚ–EnÐ8©ü:%¢àdpQî°fl2D;O5þdB›iBîÃ'|»8,V$ Êp¶"Á’õ{Kùš.ò )ËÒ&¢ü ÛLª˜ÌvªBTt¦QŽzà^.ÈýpzòócÌÅžó”À®A_ó¶¨ÛÕÉœhLgFƒšõ +VÆ ·_:ÛcÔÜ´`‘=;mÂL'Ä)ã=•…´-ÂG‹¤"¨g
ÌP¢t0¢²ã¤m°ÂUd‚öZN§µX¼|Ý)#ÝÁ‡I¶aÖ0Áa"-‡iM:¨@¹n¾<Q9ž1»=¬ÁÄaŸéz¦™ôG):[§îì QÃí± wˆ;†=/êb¶Ê5Þ°ª”ˆ’-ÚÚR‰>«5,IÄiLÀ„<áò¤Ò# ÷7ô„ÙÝá
úuÚÖÈäFÚ=Lçï*³‘ˆøåŸn®ÿr{y}wyýÍ驹úÆôÁ“?½¢'ÞÉ£/þó¿¿¼jÝ<ùýyòïO~ó?>ÿÓÍ‹‹ö篾fâ¯O~óÅ]ë㛓_}ÿòêº=;¥ÿ¡B¿>ù·'ûŸþëìê
?ö'¿ùë»ùû^ñ³ß|v{{öÃòG/þöæö«7W×ç?ÃOÚŸŸ{yõâö⚟ÿöòüîòæúìv9>éá7¿¾<o”Þ¯î¦ù‘lÄáÑF<iÔöÊíåWoî.^S³öÀzœÌêöâõ›«»ÌkS3Âèçsº~óòÏçwgÿ¢f÷šWØÔ¤¦ÃŸOìõÝåÝù·»¼º÷Ì®o¾àw65ÁÙ4æ3üêìõÅïo/þûM;<?ÜsŽ”$¹©ù-&ño?Öøß<ðÙÍËW7¯/ï6É/¯ïùI¾¸ys{~ñ‡Û³Wß^žoêÛ\^/·Üåõ;ŽÿvÙ}>››W·gw7·÷œÒ»¾èÏ<¡>úwšoÝo/.¿ùö¾÷œwî“MF¿Ø¹/ÞÁ$~õÙ|ùÙÕ«oϾô›š
üßöHœm„w÷½Ùn¾ú¿çwŸß¼¹~Ñ}~óý¦f8›Ï|ªïh¿Ö¶µ¿_ÎãÞ×ó¶æñÃrß]¾¸{‡|´]Æ ƒÿQnù›ß^|}òéQÛû©´½¯oÏš¸~õ§›Ë×G}ï½Ð÷â¦&uÔ÷ªïmKš9ª{Guï¨îÕ½
©{ÛºàŽêÞû§&Õ½-2†÷XÝûÃٛׯ/Ï®?¿zósüøƒoŒ×w/~{ñ¯Ë3zú^ªó õ}%_h;3Û¯õ=P:å‹qSÓÙôÊŸ¿þúõÅÝÏ‹ûÞÛ:2/vn‡÷½®76‘ëúA'þ†7Öçعß{ðÿâÕÅù›«³Û礴Ñÿì—ö_n.¯ïž«*µ9®ó?÷ܧ`{6µþgšpš¶6•ÕšÂ©ßÜgy·ùn…\ùÃÕ}= WzÎOÏo®nnÿý»oÅ0¸õÑÉ,¬Ôon¿>;¿øâüìÞÝV¼Î|‹É)~vsýúîìúÞ&¥mMpgû'ù»ï_Ý\_Ü’Û:¼»³8@$¢ÎþüæòÐÏ+mÚ[ò±o¯-Né÷ÏvÍ«è=bÿÞKA†=_ç¾c€Ýø‰¼Ãb³Õ‰Ä‰Ü—mlkíp]˜W—w9»|—hú~ݘfØÄ6å€Cï̳ÛË»o_^ÜmìC¼;ÿxqûÍÏqoîùUú×-ÞØ÷>µ5–?X™ú0¾Æ&ï…{|‹Cã'‰Š}8 &êó‹]\}ñíÙ‹›ï6Ÿso?@ØØ÷YïØÚLÚÚ¹yC†þxsûêÛ›«›o~Øäõâ¾¢ã¦öÃ.˹={qùæ¾q˜þ鶒å1øTËm}Ÿ:Øé +dàC®Ü÷VßÖÓ¡ÏçsöâÅåÝå¿î+FÞ^°qfSóêS˜Oíüìêü7/î;µ«Ë닳mE€÷,>Úùù›—oÞípž˜s¯7öÍ&3XÌ
Mÿă¿_‚ʽ+}ýÜÓœOæ±+QÜ_[ÚÖ±ÇùðZmÛº+¯VÛ¶>Õ¡ +ѶԻ¨@Û½Ïþù¶Ê!Á0uS390fcßås†ùIõÂC¬½çs$³±Ù<R0ÌÆjG£a>4ÌÅU÷ÒÆnÙ:æ|cÞ‘ƒÂa¶%‹ÃaŽá0=f*›dàëÂa6&÷Ãa6õ9S6fg{äpÿ±„Ãlì;Ê»·um=æ'”¼·¥Úý?ïͧ:”l‹Ÿ+©ö3GÂ}(…Ü6¶“?Òrzó'¤_a‹Õ.EyÜh–¶šá³››«Ï·8|y½OLBÚÖ6\_´qkê°¢~c³9mü©@ZRl[öˆý%Á>ÈbóQ5uVœwÉ¿åùr[X$„#Gû9ZÞÔ†8r´#G{ GÛÖ>r´_œ£mëŠ;r´·Míâöæ]¹uCû-ÈQB;ò³£„väg?ÛÖö}_ùÙÖ#IVÄ_l˳¿Œ¿øÎËô¹Õ9›Í›²©±µc³Õy?͇QIëöâåÍ»ÊÒl ’Öƒâšý‰ÿ4¸ŸÚÿº“öϧíïöÿŸ¶'›šê[C™?ò²a~c5öÔ
;V¨úP+T½~E5ª65³c…ª{–e`Aà¯ïº)~éòTsfÿêâìî·÷f—×/.¾¾¼¾Ü˜—k23÷ã«Íáš?FöǶ…Ç«þµµõAƒ—>€<»yùêæõå6Õª‡%a&~óŽWÞ¯¶¹£sHªø–ý,a9:ZÞõE·êeyÂ?ßá…Þh%
{¾Îÿ|Ç +ò(î=Š¸·©q”ö>riïƒ +ÿ|G¦m’ÝÔ§ aÏ×ùŸïÝ6*âÑ°y‡§«_$îLä¾lcÙáZº8¯.ïþrvù.Yüýº5·Â¹îÞÜ¢Qüð;óìöòîÛ—[«höQß»rÖßãÔÇ»sk[ëxw¾s:äÚÜ® +}¼:§Wç¤q}€Í#®ÙïýWÙ0+=Ü3÷€¯y¬DôSÔƒ+ým›EuøïšÚÇPhó%h0R} +£‡8U6ÎŽ¡|¬ í7úh¢ö”ùm+Ïþ@î·Y®¾î¦¥”¿Ýž]¿þú(ñùû7×çÝâI~€•íîì«Ý„ûŒl<Êÿ|ˆ¥-œlËÍ0›Áà +®µ]ö‡ã.Ûä.{ZNÜɶæuÐ>ûü¸Ï¶¹Ïü{ÌÎ~z5õíöÿýåí¶¾ü¬¦~´ö±Th[m³GèðÄÆm¦í!ÇÓâ7ÌŒ+¦q5£æ/üÙÕÕ¦Våžõ¼2CJÃw9 +ùó‹o.¯§žüé•öÁ¾øáåW7W옾8ùüòöůŸ¸“ÏÚ?ÿøîÉ›ÉÝÉoÛ?~➖Ǧ¥?ueÈ…þð®ä\‰Òþ3p”ßÓ<V7Œí:ŒÁç“œ=é€ÿø¡ýËÿÛþø¿ôÝI<ùãÉÿþ?îäýê_ŸœVŸÆ§!餆àžÆÜ:zIäLÿR+‘ëÓ¡úzBmÓÓ0¤ØˆCz}ðDŒµ
Ó"¶®è¯sê ƧCJÔoôOK ‰Ú¶×ü"æ§1–‰îiÊ…záiö~ÿ”ßnOk¹áð4Ç¢Do=Ö˜ô×G?Žúr|:Ô8º ïÖÖ§ +bÏ©<ÁM:È…æ?ä§C)Ü´ý5V~Ò>k['¡¸1T}¹>µ!{×¾ [÷É"FúTU‰ÞCÀÜóÓâyõ9Œ^½ÆÊ¿5<-5%†QHƒ³¾]žÖ2Ð:µ5lëÈ¿Ô–,¶ÿ%"m™!2qhë!–Ú¶Æ_B¦Ÿ +m¡JªÚ¶–Ì¥}»šùÛŶrâm’Ú:דgû÷Ôó'_·íÚêµnÛî
®ÆÈ»}²0ÙÏO3-Ú@»9Eúnîéèü˜=mkÚ—áiÛ잺¦ULØ®éiN¼±Ú8\–½‘ËSÞ¬öeeRñí·Ë Ä”²®Xi¯;^±0ò4ˆÖ¾W¢tY“ã؆¶ã‰Ú±HºÙKh£äuôméä{åö•~ßYNYÚæDôOãÐ63¿Ÿ†ö[üqÜøt YÉÚZ“F¬Os³B½—÷ÛGÓ÷‡Ð¾c2}¥¢ÇªŒi”³l×öéZY&J[~¿¥ÉåiHòûÁË +ñ¢%ú¶!Â8ÊŽáõ—Ú¿dÙH¡õ+;´Yé!l,À;éµýn#Cç>÷`Ç·¶c–¶±qù±(k!Sˆ9êÙ(Æo› +ÎéI*ƒŽ 6žPz•÷ÛdFù¥¶B¾T[Bl¶cŽÓ¸@ÏÝ~µ„¢G¾mIÝyô:ƒhÜ¡
;Ð\„c¦ÆGˆèÛ +
<ª¶‡ëȬ{øÙ“ß7¾ÿÉ—ô;ù+ýïÓÒ>mÿÖGûŽôGp¼?—ˆÖ–̵©üã³ö®üD¦ƒ%ç’8õK}ÐFéåTÐV’ûÚ¹ÆG†¢G¥] +Nc¡;ıØÇhC¯Ùò€ØŽž’T˜Ïr¿Þ+K‰i´ãÇÉJ†lë€ÖmïWa@ĈõÂkýf¯û¤äbkËS—*8“2€Ô¶ZªÊnGâÂX›`Q&{ûYëâ‹öÏßÛ?ãɯ~}òÿ"ÉêÕT¼z€H´ïð|t>8›ƒÍ¡Gæ sðq9ø°|T>(“?™†ÁÚŪFÄ0Újņ1è i"O¿Ré~®äS„Ð1vò¼õø9¹“ˆé/A5›¬—atÚK;£FmŠ§^Æ£Ozí–4jCã·ûcÏl±3•(Û±°Qx9ÚAeJcÐN\œÛÎÍ£®¿K^ecj[eƒ"b!ýØà±$Öím¬ÒZ;[M’¡5r‡‚’=–y·µ®sn¼¯º¹ÉKƒŒ¥É²$Æ?7…ˆõ¤Fn'»Bý‚îÜÆ° è¡x!tŸ©V²/BfÉšû%U.¹Q÷¹¿¦ÖÈâ$±Ú +4Ý +Ye–ÁCH:”²X?˜œØ1H@RcÙéƨÄqÌja +cÒ'-7ò–mãNQªÝhªîçÐgÏTheˆöºóE¥^^8‘Úš 0@< É
^Íã +…˜ƒtáMyh"ÆÕ¤a\)DIÍwØàØ>…ë¨âh°el-+8G`SŸ +Ù,È’7‘‘XÛf´!䃵S:ªŒZq%°x5*9Ò"ÈÄÚih+&§¥ÙŸc̃0„!«¥•ô„È\‚,?QgFVÝ‚o]
röÉÔG5h•*¯‰ +Ì Y' I÷7QcÊBš0"@Û‰‡ài[ˆ¼Ò.æäøŒ6"8elr“OÚ²Æéºh¾žŒ†²G‰«†1 +ÑGedÔ«Á +QoÅÜN]b–ìÕ$'o¿‹I¯´³*òFi0ð. ýHU¦,F'²n;Œ ü¨)–CT EÛ’aÙëÁUÕzUs-©«[ilÈE݈cy¡é»íŽ¬ºcŠ°z2´ºA·F aɈ\àC )<W²÷¢³ÔeR©Eb)$<U,M‘½ÕÞ!â3UÄ]ôÊRÛêCHô¼ìDÖ,„ØDíÂ
:‰Æ’â +)³XUñ>.†L¬ªª,šI©Ð¶ C[»A‰MÖðwzfàf‰5 ƒ” 7QÄ&)èÍÉèbYˆŽ˜\™¤÷„Q¯1–»”( +.1ø\1³vÄBqeVmêÚÛ(„˜ÆÄœíõ£J®IY)N 7n„S<œ|e@ãÉfsf9AˆC‚Æ3¦ +pIú
¼7S¼óƒ. _†˜W» 0)—"bÍ#>¢îNk]l¶å£5/¹q=Û1ÁC¥Éê>¡î³vÁŽ*Ý1£Wý‰G|ð2J¦+Ý–•jâ3ë"0[;ÛßM…‚FºÎ
›˜Üô«ªg׫®Ò]Œ–l¶\íGýìÕ–M’HV€}„j'©±FÓª¸-î0•}“ѳLÖø"âq?Ú½æ²1¤ÁÇ„;0è>ŸŽ{•±ó4&„8&Hí@èº4þçÒ»˜"yÔX$¥{K,–íååÚ¡ÄݬÚ&GHCP÷ˆX‚J.ƒC4®Ì¯|9¥û¯¯j-l{§Â-Ë¶é ˆÇAXª^—…¸«×ó1;¤†úfªuú¾ìCR#…ǵߪ…p¤øbƒZ&]”𣛢êR›XÂ(WßÍD¤Ÿ€Od Ž-ĦŒBl;B»% "n…¶ˆuJT
„¾LôJc뾌˜'ÅÍáºs"{ú*|^¶†E2h›¿@%rdÎÙÈí.óØž"òÐÕ<`˦Ì6¼FcgÆl[õY6¤ÏÁ‰hо3Pq<+vŽ÷•˜U¶(ݤ֖3óNô¡sï¦ øQ‰Å‰r—i÷zí·_îÌ¢£HðDyw±ý:ŽÊ-mf*0®±FLrš=Ë«P°ÐÚñ«e°÷› +DoamÛ]_‹kh-‹‘ôKtÐÄ"•à5À7%;{qž“«AÄ“FF¶´KUÔ%‹PNZz•OÙö}öPÝ[Kl[ +:–Î2¶HàEÛ6K.&OKd)Öÿªê%¤¸Ëûm_æ´£4©F´•¶íG$<ÙØTJÒg“;ŒÈƒØïÉÆ9èþbïu†º¦}¼d½Æq…°9Àv`"±]‡Û¡ýDc^ª +º±@ufýS.›¶Ú9W.bò7ˆ>Ü–1xxRF^Io½:b8îBF§*y6sK#·}›…\H
y®äR«jÏøûK- …ý?ƒ1²YЩ/‡çjí AC¦ÁUÛ&ÞLä¿B¿I,Mlañj.›™L[ü¹Rõ"#ƒKáã‚&‰MˆMtCP[Àn…µÂ¤¤šv–ý®mU'o-%새ÐÞÛ]îdÛáú!æ
ªyè‹bhhL`„ìÇNª¢KÀwÃs%—2èâ²±@¶3ëábrªæås¢ìd74Y\‰‘ê¹’‡T&‚Í$ +Ï÷·&ÌߟÀYýãýê³7_]œ|v{÷çë¿œÝ}{òùí›×ßžüíææê×ìÕnðyò‰‹npÁyòÞU7üÞÍÿãåIãëÓäß5&1ægÁ…ß—â“Orãóïœ{òÉ—¿i?5‹§üäË;̓ù’‡pñâKÅL~òå§íŸÉàÙÓþâI6wü!ñŒzUí!$Z¼TªÚ<Û
+ù,‘Ϙu"7˜©‹Éü¾#ñM£~è¢cço“›,Ɖ´sôc2išUDfoN¤Îs=—íÊä¼mbçƒÁ&&%ªus°ÀµFdG¢Y\f²¯¢;Щ)½M ` +“šs°rí4~nô ~3¹`xÅÂ7™MÖÒZzͧœDvb´xŠnƒ#rE”Dl™cD¤u`—JÊŒíÞ;c¿0æóBÀ–ÎçJÎb'àŸ+F-± ™tBkl›EÕ¥FSùŒ;¨ ûôÞw~ññ¦¿Ä°Ä‹£æ‡j¾}€|g“÷) +vÄŠ
6v{ã‚»€,ø™rH{*&ì©q˜ì¿€ ‡âì7rF(ËšBŒÉt1Â6#3[BÐk̈Â.±Î8ì
úb"â‰X ×…¡¨>t›<}ɱŸnxÒ“i’¼2à$(ø¦Ñ,´¡Y¼NÌìÀ²¦§s°U¬ÉéþâðòþqFDk„GlQXÐqô°õóX°iÚ?úu4œ6R1¦Uaµd—9I:#Á6ÊÝí4uùÕŒ™Ä +‚m¾)LÈ„?X›ª¡_U²Ú”á'ô)öo‹ï'd]Ü +¼Ÿ.f]–ÇmÄq]*CUœv–¡„ˆ0×"Íè·ë·ký†™t njn9ö*è–b»–Œí›B°{Cʈ88a]²Ò³ZÌO7瀸X««³Ó׶Oìîv¾ê¸8¬ñ9È1ke¾Ù®¾R¬QñEügz×g§³ˆê«!¢&çÐA‚ÔÙÈl~Ó¶“Qp8½UÞ¡0„±eC‰6C$Ó4ºU‘IìC·CuΑ’vŒ¬šUeU‰£×¶ip˜G- +‘üâÖ'‡ÎëÚø5yÜ>ljƒ|†ˆ«"Ç䳌ɹTò„ŒEoWs'Ck-ƵHòK虯nsSF¿ÎÛ ®Cæ´`½ªQ–dÄ$QÎ$ç‹äå\Q‚ô¨%tšLlÛâÒ Cêa5$'â¤è@•= åV‹Ž%é9$]«úóêÐ~À!pXͧÔA5
`:¬,)íD6?2IÚÑAÒÆWf”Èr'aº'5÷U,ÑkÛ`*c6ìSFä¦!,¯zdœ›ÎEBùue¼9鈜{'"¬ˆ¬a!ýÊÃëÍæ шCÑü^Jä +©'ƒ©¤£˜˜·ÀøEl¹s‘b:9tbbN!xcn»1Ñ6vÖ[m +V q¸Ì¶‘ÍœMßùµg6Œêr¤¨¾†¡ñb4›M¯
m“iÛ5`dkgWv-‹!þH˜Å2.ð̘LÓ-ê¤ã—FÆç`¸çû[w^…˽mg."c,ƒ1H6ÁkÛœa ÙRCZ¥Ä‡ÇØ=ƒ-3‡
ÛàœGkâÉüc£)OI\)Œ]¬ ™h‘ø ¸•Lx#ò€dºä'þ©R+7¨œMD:à8˜YG]œn"drкé‘4Ñ; +#ž ‡~¯–®@Vj´‡ï—Aþ5äîtœkï6[$b1©i†ë®öªc¾Å’ȹÛlC˜xà\¬ÞzÕ`NîÀ™§&#Çhâÿnä# +s½µ×µ«3Û:‰NH½ŒRÓ“zb¿>T.N‡·, +! +Ý‹íXÚ"ážnªê“ønI÷nØy½W"IFÊ88ij +Šm˜ýÎìV.¸¥&Ö³d…4ùÒ&÷3Å´‚•“!9#›€ž0Fd“×Øycä’âI%–`Z`G‰#Nž³‹$‡›wfׄ#êWy‰ö´xÓz…Ÿ‰½ÝûlC€|ÊfO½x:%â*bOÈQãO’ÔÈb» çª=[ÏM{ +}Vc€šLj³´G«óœLúñˆÔŸ˜Õ£«Á’4¡ùÉlž…ªÔ²¢ÖŒOÃÐ…Ãâµm/‡Ád(PÌÌŒl"n;òXôv¢Q¬$;‡9C7dÓ?~®I«(Œâc—E¹þŽ¶NˆLÑPn&FWQ·¹m+Ö¤©†•S?Q§š=™Âš±2%ÚæŸýÄÛ•´˜ 褩M4 +?>]HùlT蜺ûì°û‰½cè\ÉtΤ)ð,¡Z!
š&¾¨ANqRùA¼(eãÆ~m5·/Ås:ãPL_ÊJ~Ì¡{45xžõ‡ÜÇ›2¶TI˜gœˆÎCìSíPM{ð¡„jF ++Öë’)6£E”UÚúõØÐ9`m“›qïø€ƒCÆÓ$š2Y/“"ú©ºîç¸hn‹îƒna¦bñZ·dœÈ6f7âÌP#›…D€.ùÍìj=–za}zidoäú#¶*ó1$‹+¤ËÑ|s)ðùþÖŸ{àp{7á?Uay©ä„ú'òï̆«ê5Vð/n6ˆ%ªJµ6‚ìZÈ’—/ÄêQõ¢ùé\;`ÙªJp¥òªÌ§¯S¼ÌO„È—z•€ˆ–Ucß‹œbÚW±¢
%Šì^%ì*#Ï|1ýó¶‡ÏéÒdõ¶CáwÙ³ÖxðÎÕF¡ÜÖ]ÜgÅ¥í}×Üz^¿êŸ|ùúýIÇ]½\ßëGó‘D„j"qƒµÕÚñL¶ô*
ˆñEËñÜíW@œÞ²±ÃzW–ã,cþ£%u²•ŠøVTå#Z®÷מõa¨©§HÅHFµ°"˯ßmÙPI”1Šè¤×™),§<ß×´÷0ÊIiì}Ê“'S ˆlAeˆ)äªfZÖ€"F„M%K}+½´OÓ2ºÄ!g›¨+³l\¤µêÞ‹÷`XaéXY0-w"b¯¸p#†Ly‘Øë¡o„ÑLÀˆlQC\ÙÈZ“©˜-™ˆñY¬¤j„Æj¶þ(È +ýÈZ¿jÍ)½nd«ð;Û¶Zêa¶1¢„àhãa2äPm¿L¶ëÉB¶ø£99ÇIk‡hA3dÆŠ†öW‚•k“Z7È×*Û¡D¨ëˆ£6 ÄbÙžíßöº
-öqGŒœpú¸Â˜mú€ó4Œ#ÆÀJ ±m+B2ë\°’¡š³¤D‡0Fƒ‹Ìä',Ø·f&í…«h¡8t› +ÂúCOÝ tÖÐ6Ù*I!QrA%8DðªïO‰Æ–œ6£UÞn2³ö9i ×& +6, Bz˜É‰ŠÅEþN–ªE¥ |uôÕ-á +ƒ”æšv rƽ[“±¯v~PR«Z§UŠàp’Jì<
5’(*|ßYU/$Épu!KF!‹ +°Šîý¥uGLoê))løÁLÊØûˆÕ^“EL–hq$ÔÉ8![•6‰‘³dÓ‹É®Ò!öEF‘æÅ<°O&}j¯&®m"c,XV¿û>…ˆÕãï£ù–&j´ä„"•1~|L&¢[„v©"kƒÅQÇ~Õ¡0a/i7A@<ž˴“<|TA¤¶—;‹{X‹j.f}‰"9‡ÉçÕÒ;YüEFv0ÎCöð&óÊD” +ŠbÇÅ[Uÿ’&›Ì[º]®ýÊ=¶¥hÁg§³ÉDyÒØbc›Ñ4³¤Äš ‹ŒÃéò8]vÁ3YDµj=`?8˱,]ã‚ûƒ’{]6µ‘¦ˆÄ‰f£Ï=Ù.\=R‚…@°þ¹(ê‡8Y›N1‹žšÌ²Œ%zŽr¶¥°("ȵ`§rHP-‘UTB#ÇJ™äSP±3÷yêœ-fŸ[;”íqXƒØ4{'z;gä_šÿmú—Õ”ZŒ¢‘Ñ6žDn4ò8L¨ëžlWª4BDÆüˆ¬m»ó8 +ØjÐNyý ØNëbp§¼~t§t±¼SÞ?¾³Xàù–}ö¼=øZ|Âx¡pÈS +×C{b1 +¸ÄÌkÆTd +ÏÕz(S˜ +iu=䩈Ì{@O»r¾€=Ń%ð©Ð‚>…Ö~ +pÿ»o¬ê—F«~ù8ñªË‰hœé'_öHÓÓc +®Çd¶Ó´De¶ëq™M#Z"3ÛƒÕØÌó,Й©ÆgF;Í&=Êš<X¢4¿Å9µTîÁj¶s´æ±ë¡³=˜Í]¶\ 6¿å£~þ1½Ýó™å¦ÞèèÇô=ÎWÑpéþ`/mô%Àô[zšŸØ˜éþ`4m–PÓ]§^6=Ðàt×·WCN/ížrÌàéþ`=ý–7æx€º?X@PÛ¶Õïü`jt°Cm]DmŠæŠÚ,Á¨íÁâÇÔÞõ€Ô¦•/!©Í4¸”Ú8ì–Úlƒ«©m£.¡©'Æ3`ß=œÚnÜ%<µ=X
PÝ{X@T›ùg5Hµéj˜jû\uTm¶ŸõPÕèâ +»›ÎVa›à±„Ã6yb5 6z8 +î`ø!JZ»YuÑId£5ªMa ÐPù +n$MXåð w(wBRªíá$Ïž|½Ÿí¹“ßüÇõ]»¥Úsr~óòÕÍ›ë'¯¿={uqòòæÅÅ„å½yò«¿Ü\ýóìä·7w'M¹»¸m‘X¼7fOÿýßÄ(fÔÀÕ]Ãÿ9yõDïë‘ +6ƈÅ*‚lcå¼s1¸$[ó‘ø§œR2½°V=†Éç¡"ä1IývbQ^EzG°8R +9«I!©SîfÄ0À8e«Ý$ÎĨÁ$8ÛXíÇ)»iÀŽÛ,Þ;"cw@⊘±x{WSïÄÌV4 Ve#AWã²Kí(ž?ùý[n4:ì¥ñá{]hÿýd½ú”Ë‚Ë}À£Äåù³¦d™b –Œ†2MlÌVæ'Dª2L¹Ù²2dõØÁö^ŒÙ‘”#«2BŒ´¦¬‹Òjx\I9‹°£±°J–©Ü²„Â×ß–
hƒûjà#'· þDIFŒRü”qª´<^‰M¿ßŠüÅôܘŒ~pµ¨Ÿ*”/«at2(±"äj× A9±û!;‘ÕO¹rÙ~Ôºâº<‚¡Zæ aôr]*eQ.%+æ5>-¸é²®l£2#€–pO“ìW`$ +[²a¤–ž÷¥õ™¯ÅN+ú—$ŸíÙ“/ƒSíí—Hpy*C£€u4I)t„®(>7êxûðìrR´€jŽkÙ¶$o¾‹µr&™ýS**>ÖäÆ8ºì=.£~ºA¦ÄV³¹Ò‰ÇAw„\\D}L`A¯HFtVšŽVâ%JM +Ùh´“4ŒÅW± +¶ÁuK/AÄJ–ÛX$ž7•#[Û´ÇÒùW5¦V%þW4-•ðª:¨ÏmvÄ|߯„:B¢°™Éœ°÷TÈ Ù}d·§kh†K•ZmrRý¶s¬5í“, Š^8‰€àÆ%{õ Šè’¨÷#Î-k¥ë¸¹¨õ€Î‰pâÁ¡ ,ù89ߤ1²FôÂÜDåð¥×†ëÑ–ˆÇÂ×®eW“rÂòzÒƒÑE}|¤r¨P—-¹—tPÕ†IcÊe1 +œßœÙ*ƒ$'™7¢·%'(«ìgµ"–Vh2tXjüºÊYyÎ%DxJm㯷YUp@ƒh߶ö„VªÞçÅ›Ü µë*1Ýc<C6Îçbû…lb6L#J<Ÿ2x‹‡Ü6k)IBaSгZ‰9Š¬Lƒ"ý@n~}¶Mº íŠm¼ +m㤬JEÊo2æ-8Ë}€Öù#óg©¯u·•-Á™6&I.aS3ÉáâNfcK…Ç¥Á,8¥‹åƒrN²~ø¬Ë— \`S p“©ód S藺€ÝRù¶a/‰Gö†û" q/qÉhÖŸ“ˆ.áXÀqŽPÁ¸€ (@ìeÀ‰b4q„+ÊJ ÛØ‹–&)¶ÎDv™ +Óõ¢"‰¯žAˆé±ÜöE°rè‹HÙª’¯Í!¹ª˜U±ÈTý>y øŒâ«²/4Ð\Õð’ŸsV³%™Ù!‰¯×Žˆœ<,ú¢ýд|Eõ‚I¬îäsØÒî°X"^K¯ÄÉ´@ a»²e1DË‹¥êÑÙAçeˆ€,¢Ò½$†.sljÉUp÷FK÷òz…ýðDºPã$áO¹´vÊ&ýú_è×V!À«R1d©£‡±¢åEŠhË° +HQÖ5ˆ _!v(zèìi0S4œ
ƒ +Qù¨åîc«½1£ #œÃ™!î¶è-Vi°µ¦¡â†)(ßKèƒÄ‡ÑÁ0¯´<š9ÍW§üAÍa*§ýsB¥÷ZÄÿ_jbW;lt†,ª?Æd[^À’xHêͺ_h£ËÜ&õ|† M²_ôšæêy¦@Üç:‚QdS’ÁÇ4U„ +í8ÙG µP|2{'P%ŒÚ÷tú²p¯QÀä 9ˆÑ„«¥L–ˆ4AD
Q!À_aÞKQkéÀ£<Šã0ÇQOlOê“ÕèsðL®Î˜Ä8>Šm¨o:D
7…SÅï$V"Ç^?í?Ýf‰\mZ¤M3ï§
™$æœôüáÜUe¨$¥ªþçTÁ¡Á¯ÿ †.Ý)€ÓAÂú˜¶‰3{ª
Åg‘Ø{/DøW„5:$Õ±'çÞ©vÁUÂHÖ‘•UüEöå 2RŒ…N:XQøìÆòÅ1F*דÔûÏ9+à+êh’ú®>öÆ/ƒ¨'Þ‰‚æ?T|r§µCN°bF-zMǯ”Ô=vÊѱ<©%UÏ<‰c½ªNÛˆžƒàôª6ßv=Œé»Ë¿Þæy˜|ã]ã±T™‡V"%öóŽC)S¹ª{rù:7(@‰2åSâ0šD´"¥KÔQ_PÁRî)%Ì^5š/Dìx2÷Je+B÷{\+m‰pó‡ŽÁ‰—8«Œ:¸ +u>½i4ƒ™" ˆ[õµÃ’C©?Ÿäj€#i”ˆq¯e0å¤k”6É>*¨æbÙC^Ø’poѬÎPtR†@ìBÔä Yx)³öLõEµ¸£…~R’"žü}Q¹‹ˆ©ýÅc +±ñÑz:Ò +“Sø»&å–ÉîþÁL{äÇÒDÝ‘œªçåAÖÀIø±gô¿Ç\^…Cæßã°—zqˆ¼Åw=†a±„TëTÖ°|7ÝÌ·I\¶|ôZBŸ¢6Òà;Úf«€Qëm ÒÿR‘4-6ÛI}Én +›ˆÒb°ºìcÎ:3P +Aá%Mê-ºkX勵¸Ÿxû_{;NÝ<4h¤Æ_/¾¹|}wËþí‡Wj! +»
÷ý«›Û»ÞÄüæó››«y›ë³¯®.þðæòÅÅëÉÁøìêæÍ‹Yì¢X§\r8ô ÉLT%x"=Ù#IOôẖ8£ÚÖ¢iŽ]Üwè÷Å’ÍW +î0ÖòºnpZ±”î.tJ18Zl˜ì;œÈÈj…×ðýĹfHûž“ Ý] +ã4~LÁþI4VžZMf"¨ÂÁ‹¼/°Ð$H¡ô”KR=š:pÀÿô ÌDÎVèω^KÃ&hxãUÿc"É•$XI Xʤ’Û¨`Œ°ŽF/a™D¤ø@–%†AÌ<…‘´b +L’# k ^ ú~‡d 0Y²_ *ãŒÑýψÚüûô#ÅŒ†„‘&Ì&©Å Çõí§ +²ï²ÂË' –pÂ^ +¶!È0åÀ«¢nõmв&6S$Ù‚dPÐÿÅ=ˆAÀqm>¾$ªz‰X¤rlëµJUVî€ÀÈȲD É;B+I-Aj1;ºä»'±øÒA„+Q‘éú(Au%Se“Y'y]s–9«óê)RæèX™•&·£M"2uÖØ4î€ÔIô¥Ø'M*dr%e¾<é$FH¡€7Rùýdu£ªB}ÓQ®(É`š¬÷:N½àLŠ-"-ý\=ßVlºWhV7Ô4‹´—ØÛ¦ØÁUÔ:Gd'E JGÄ#ŽÄ+òŲç)¯}^—ÐÆQ̦ Q…F§o'ÊÏK!(¹1%;¥ƒÀI¤èœÄ²X +(E'¦1Å7¥x‰_%^!¦D +/‰ðø5¾¡UPÉqìnù¦A KfÛ¸È~t·¬²¬Æ ¾ÃºLÎı|QÁ[ë +ùQoÚmâ{!ó@’©èÉAѵÈä;±ÇoPE‰|[#3xþKãV‚½KŒ¨VPæu™”mOÂ@´®Ä5+téL™Mãd²¨¡#Æ°öD-É<+HRééÚeX]zz<U/2•p%6Úâñp8¡œ”A†¥UºÝò4¬¶0F¢Sl[O#÷ɬ–ån$vY³~†ˆ‘+¯éêEzì*¥83®öÈÉDU~ŒÒRX âqë"ÒÊr@[˜¦Àí1‰!?Uñ’=‰“^ÉhW
¡ˆn1*¯-ˆGæ&}wò¿©ŽmÛú¬ÿœr¸Ç‹‰n1Q}FÂÁO4ȇ=0M¦Q,N/iª>EÐÄcEÇ¢ ‚ŠeÍIÀ
]3lû§ÌqÛ"õ’·TQ©Hé>mDò‚¸©XôH ŒãJîÆÞ½!j)ŽUÁ«ŽE4r£g"Œë•Jû%kؾ£[Yý©à2Ijñå{H~YU^ך,Q!+D™ñR#™ŒNô‚hcy̹£³j1ÄÑÂXtœ$ö³ÏV;H£G¬CUÕî1©C½UMÇÉ@î!·Û‹‘€bØûBNUS¼ª¹Þ霊¤á(]LŒÃy˜CÕb¦,Â"Äþ¹§¢áPž†×î +DÖ ½)‡QÃíÙë%#Фo¾%3‹Ë—¶ŠÆlRuœ/]4´ŸñÓe +—[C½1:à—“”E.ªTÌ,ÆW>z
ÈTylLjãæRòcQ5H]\,ûêM@š”†¿Òñ–¢÷dN(ež©ƒšì–»îO1j¥§]¬*×@ß0ªêî¥R
ë6™w!ÁLAidV)ö’žä(
`©j/;eÑ$g1è +$k¡ý¦+¿•‰fæ‘þ"R8]µA9a“‹8Œ…{–ýO%±¦H6ÑðtT•§ +<˜($døq7Cå$ÝÃåAÛBe©Ó¥?ÕÍÊ9¡úóTaBò ++,ëÔ“æ–,®UiXÙqY4O^Ï°â“NÉ<ࢠ+ï0…#5F}´å³n¡NZ2¢êÛþ6JgÓOÅ «¼UÉÈ,—Í?JU›!‹
I6@±b7À¾¬…
Iý €Å¬‚¤D<n¨Ðø0ì(†gJfŽ7 {³BÖ;á€E.
ߢÙ"ƒÅ‰ÌÅ,©r"‘¸Áp§‰Z8oZ.«ERñXeûR‚\%¤¢P#…ØÉg"iŸeyÑxŠF§°
›OѨ["*Ê{”¸Ô„ÜGðPàµ`Ï‹Ny†’L*€öÊe¸“„t"f³À*Ê~j
o!5Žogž®Æò°Ìe +é1›ºDe¸@ 9>á…åºE¢¹£N9¤^pÈH±aÍH.!†.'½ŒÌ©¤èqX™]šî»Â°Œ`4ªÑ‰t£ìkåÖ¶^¨Â +˜ZÕA>kœðÑÕB$NãtCB† Wgh)¹Wó ïØ{ëÆúÃíÙë׋o±Ç}YÄ‘Å( N“Æ2ï5Zd½Ã’HÛ’l/‰ûä¦Q[»¯b¢“›Q½7«1%dkѾ|s³c€c
¸Ö'EïU„ÙsÆȼ‚ëÆAÌ¡Äј F'7‚2i÷ì‡âEõ"[Y‡Ì>1œj4•±H\|‚†Âê’˜€Á™é'¶ö{N7ðSŠHDÙäƒ%Ѷ†Ð}ÁÓ“Ù؈¸¤šhhSÕD.g¼I?•M3$tà4}—‹#h;OXš%>’¥/Å÷6ªSÔñÄ«Ÿ´0 býN¤1±ÔÇ¢ž„Ñ–À¼YqJÄoî¤èc±°L
ñZÓð”C"]F0¡#®A}Ö¨5'’C‰ÅÃD¦“° àÅÃN #ƒ. - ´nÛÑí4³DX:`+æ¯ó*iÐo™ÿÀ›†¾ï-ñ°¯®õSf§“¬§Øçmli
·7;FklÛfJøð ÂjÄä†Á°ŸuýµE“#]?Øj‚ò"v(×xñ¾¯d‰K¢½¤©¦t,v>ç(±‚1pK³x§mÉÄ<ÔzlQJ|‡^ì·¤\;qª‹%w‘99—Dþ
}»2œ v*"'1ÿ›í<%Df’lè'ð‹ÉÄÀ.¹ ‹jýöû„Ñmlø:¼2è¥4W©›Ç¾-j]i£ŽÖ‘|È -ûZž…i£†ÏÌÆî}±!@>eS§^<ƒ’p±wä¤1'Yª`±_«ª=[ÌM{ -cVS€šL^i³®'›óƒœMúñˆÅŸ™Ò“«µ’5eÈl˜…ºÔ²¡šŒÏ1á°zm; -^0 -33#›ˆÛ<½Ÿh”#)Âa)Ð
ÙÜŸëÒ*JŸø4dQ®°£3¢Q4d›‰ÉBTTàãmnÛÆÊ1i2aãäNÔ¹ifC¦ðe¬LM¶ùgd?óp•m&:ijMÂOR>§€î¾rØýÌÞW23k’;K¨V*Fƒ£‰/j`SšÕv ŠÕ¸i\Õ£MÂíK1œQgªéK¥@ÉO%/¦É³þPÆxsÁ -2íL3Ñ9VÈþ)ÑÆfÚƒ#TsNX©°^cȦØTŒ‘UIjë×cCs´€³ÍvnÁ½ãJ -L—hêl½LVHèwÅH5tçMœã²<º,¢ž·…™ŠÅkÝ’i&݈ۘs?l>†ä·bWñÓëÓ#{#·Ÿ°U™_![,!]ŽæWX•_Þßú—çØÇÒM‡7ûOVÞ(9£¶Æ‰ü73à&ay ü‹›E±A5©Ä¦1Ñ.„"9÷Bl-*žÎµ–ªš„R*Ç¡ª{ú:EÇüøLˆ|7 -rÈÓ?ï»çc¸Xº|Þw%¼,÷¬2|pQøv•F›¬µ´ÝtµçÝ×û³¯ß~DïÑq?/×÷ú#øÃHþAuŽ©Áªjáw&[•úÃÈ’ål®w†Ÿf¡µlÚ°ÞU]¥Ð7KÜXýÑšÙJ%|%ªZˆµ¿þk/Æ0Ô°S¥¤
£Yàå˯·Æl¨DÊ%t2êÆT–J^Þ×tô#ÂnržF1¢Äx6uÈ6†¨±(3ÓŠ†41!0*[B[¥zª’Ñí,Â9ØDÕh˜eãdäfUÓ^Œx„»ÂäJÊÂe¹]Å…1dÊvÄ.c PfâEd‹â’ÆFÖKÕ,ÇDÔ˜Îj%*øS#`05³ì'E‡ÕúUÛM•øt#[Þ•m«¥V6F’ mgCÍöËl±V,d‹0Z%—4kíh¦áH¶i¬h(`|5XùÕ6«]ƒŒ¬*˜Jôˆ«N8j%ûöâþm¯ÛТÛ4Äȧ+†Ù¦8Oqš0ŽAìHˆ}[¡°‘Ùâ‚• -V®¡ÓÁ|qF¼Ž|FõkÁÊf%Œ¢†@TQÙñzØqD”Ш°"ÍÉÂÍ«Uã^‰šSD¶2!T•—`2>زõ:Ív vZàhýÖ8.ÙÉú]W+äá «=¹ÿ°ç€ž‘š’‹ú_¨%Ž>³*ûdήõù5xÆ:«öÌ£ -£Ì(Ôë=AÑÅΘ ÒÁ>¨ ÒÃ^¸ Ø*{ ƒJ{aƒÊ±Ùô'8è龡0(a„‚ÏîŽ*‚Í^8¡ÒÅ^H¡ÐvÆ -E»£…J{á…Âf²†ŠKÌP¦ï‡Š®×pC!7ïŽ*=ì…ŠEÝ=_v
?Tì… -‘|wQ#k(¢`({àˆÂ’¸’(.°]±Dåý½ÐDQ\h<Qéb/DQ™È=˜¢x°ª(Ìk¸¢°gïŽ,*=܃-Š{ ‹Ž.vÆE{ ŒB'ÛcìŒ2:ÔÈqFÑÅÒ(·Ö¨éÌ»£¢‹5¼Q|¿=GÑÅsÔ軣Žâ\íŒ;*ì…< -¸;ö(˜×ú¨<ØÞªÝHad܃N·=PH¥‹}pHG;#‘Âd»†EŠ îŽF*=ìƒGŠï´")öÛ8O{ ’‚S®á’âÁȤvöÀ&…º¾;:)zØŸZý¥Ðë×0Jñ`
¥ÔìŽS -iuw¤R™ïÁ*Êù–x¥Bß±Zû˜¥èbÔRéb/ÜRØvG.•öÁ.…‘a
½n•=ðKMÅÜÁt¸˜¦¢Ÿï…bŠáá˜âÁH¦ÒÅ=X¦°Èìf -µ{‰g -úˆ¦f/ÚÓšÿ¨¦¶#—¸¦x°²©œ—{°Mñ`‰n -ú¾)Nާ濹åÔ,qNíÁîH§ÃUvÚéÐHx§ïy~¨Õ €ÍÿkÓÔ¯÷Jýúã„¥.'¢á¤Ÿ}=JO¡ÇÐ…_bè‚ïgçúæú¤k'´_,õ:D0軃Ã.¼;L0.¹=€‚í"Ú*]ì,=ìŒÝ·`0±d0äè=@ƒïßn¸ÛtðG¾ûXC|oHÓná>pá{¤5rÀð{ºš…ÔÜ3l–@ÃÖÝjx<ØlxeDKÀa{°3ä0zØtxŒpxØèKèáû_x¹ÒÙ -µõ¼;"µu±3&µ &»£RÙfg\êaiÞ™ÚF±Ä¦¶Ktê!¬íŒO=6ÇÎÕ¶9–Õc×ìŒRmçe‰SmvGªÆq^ê¶aW´jã»ãU[ÄjÐ÷À¬F{ VÛ(–¸Õx°†\=ìŒ]mf¤ÝÑ«ÑÅ~µ=ØÁz˜Ëv°6Ác‰bmòÄÎ8Öèa$k3°.±¬ñ`
ÍÚ,ñ¬íÁîˆÖHÖ0íÁΨÖfb^âZÛó@¶6ÚÛvF·6#ÐßÚèK„k{°Ä¸† ->zZà•7vFGkØàødkèàö`‰nvG·}²Ä·¾—(áö`‰>¬"…}‰n–háÆ—xá÷<(iåÝ1Ã×íŽþÞƒ¢v‰n–ØávHvFŸß?],ľ;†8ºXC·»ãˆcíÖÄǃ–8ìŽ&>XÒ®xâ¶ûvG‡cWLqÈÝQÅÑÃθâ&P-‘ÅÇØvÄ¢Ú]ÜzÞ_Üú^"ŒÛƒ%Ƹ=X¢ŒÛhvÇ·.–Hãö`‰5>F³Š6>¾Æo|Lx8n`‰Üi–¨ãö`WÜqë`‰<n2ø®Øãc7¯¢¹ìŒ?>ôƒ¹=ÀÁš¦ù%º -ù˜ÍÎ8ä6¸%ùì¬b‘ÛƒÝÑÈm¯-ñÈǃ"¹íóÝ1É‹ÝQÉM¼Yâ’»"“›¹;6ùCèä&â.ñÉǃBùLr²¼íiåÁ¥ÜìŽSn²Ö©Ü,±ÊÇ´r»½wÇ+"ı܄Žfù /PË!á–Ú~F°v¹u±D/7Io‰_nvG07IoanôQ̇p¹À1·K$s›ÎîXæèb
ÍÜìŽgn²üÑÜìŽinß~‰j¾Ü‡môdsÛÒ;b›3´@7ǃ%¾¹Ñ—çö`‰q>,PÎßcÇX5r¬a´óŸ°cÎæù‡e§%îùÑ1²î9c?dŒŸúÓ˹-ytÜkþÞbnÿÙÿéÝ׿»~õÕo¾¹¹ÒÿþòâÛËk¥üêË«w'¿¿ºùáâö×ÏÈ\ÏÆúwýdJ¦ü9O±%d4n -IPŠíMU%Ù‘ƒ }ÿãìy]¶~~væ€[€Ó÷V\ì8¨DF-¢|R6´¼!rljSã@/n¨Ò&alé[ýVøïÔ6kê€þ€Î±è÷>ûæþ•þÕ)á?Lý\þz²/¿üâüüÝ›¿ÞÜQÛÙ û»}•¾´<¤fùR(‚…R¾#¥!Ó2Eï++ä+Äêþä‡>t7E„jU*(Òì]kšÖ:?,Œ›(¬‡v{ôšÐ{JùöZß¹kHlÈ}A+BU%F»ë÷Y@DňXÕîDÏ©ÒM'æ¾âA&m%25zÍ%bA¯TV¢0}…‘i¤3œÓë~Ràr¢:•O ÉÉ“Ñ3úü<ZµS±ŽÐÏsYçS©tJaü6€2cÐÚÍ‘D^„—¼²–4{†>MZ‚2Rò,HÙINjï5Y5¡4I„bÿý&@šè@êsF7À}Ò¤>*!¤¦)äÑùçbpÊQñ©¼E„à¨G¯ET‰ÿ8Š–¢P\$€"lV0p•F¤ú%ý -n"PLX™äð w¨OB¼Qê‡ÝÃI^<{}?¿s'¿ùÏë»~õ;ääüæÍ÷7ï®_¼ýîìû‹“77¯.f¼îݳ_ýåæêŸg'¿½¹;é’ÆÝÅmg…Äܽ±yúßÿò &1“®Éþ÷É÷Ïô>žØa@à`Œ0¬"fd*gŽ‹A%ÛšOÄ?å”’i…µæ)Ì>}±OYêóHò*’5‚E…R -
ý$¼HÎW:ÕYdQ'u·èì69e”s ‚52.VÃgƒýî¬PFF;I#R|_Ü0Úz«¤§MUâØyS92+°yzªƒa5ãbMwE©Ra®©¯ùü£ÍŽ¸ã• -Zh®Ã<<†d;{©¶_È\ À<¡ó)㪰<Èm‹Ö}$€4e#•˜£ˆÅ4(RäªwP][Ðl R¤ØŒÇÐä²rÐlY.ä”
]MáMZ"Nnz«€·¾ÏŸ½ýHÛ;&HGt5$µX¡ÙeÔAIi\à€Ì -UɃ‚mi]`‚!8
®DLdÙ[®¨ Ð7>Éý"U©•É|˜·üþ,wó'æÏb_ë†;?)[ŽÁ46eÉ -a« -c&Éáâf»J™„ÇåhÆš:ä𨜓¾èòå(1lD`6ÍlqªÞý²Â8¬‘;šyU¢$NžØ—í«$¯½Á½¢zNⱄIU9AÍâ¢ä0Ì.Ð&„É$®ø*ajÓ(*š¥:Ùá)|Ö‹$Rº2u†Ft£âqß -Á²=È/Re–Jn5ÔªòÕDÓ'ȧ$Ú{ö@ðÅQe+h¾a«ªY!g+笾J6£BF'8ÑWtBß¡iùQê!XÁç°‘+ø`µ¤+‚Ÿ–^‰yi1BZe»aHZ7öHU’³[ŽHL -+Ž˜6‚“Ò麙 âš!=Z™soÐìue“¬†JtR‚îäAW‘¯t°‰¬])Ú<ú~èn´\EœÄŽ$þ•ÑÄߌȬ˜€û@C¡'û(£n‰ÏfÍ$ó¨Aû‘ú¹x -÷š¤˜¿$É™°®”ÉQ€ ˆ¨&¿+Â{):-x”2q¤8é©‘ÍáIcRÃ}¾„ÉqÀÙ˜G7±½õGcÒànÃ98U4Mb%6ìõ#ÐþclÂÕnE -4ó~ÚP‘éògÎIßÈOÇ]S†J‚©ª|Nu:üújÖçÒšÿ$(/ÂpMœÙS'>‹ÄØ7!ò¾¢žÑñ AŽý48÷N -®èE⬬¢!²§UŒRÒrR»ª‚Yw–/n/ÒÚ¸>;˜¤ÞÎYÝÔPç’4võw~©¨õÞ‰Næ>¹Ó‹‚Ú -!W5»‰¥¦ãWkþ8åhQŒM*7I…2OXE¯ªÆv¢ç6½ê„Í÷]SùºÀò¯÷9<¶ÉÕ@G -›àØø-¶ñþg?èbµ«žãŒ)=·&®ïçY„)Ò¬Dçôõ%åfBÉ hVؤ‰Ê|b“WêNÆÞÇ5Ð6‘ˆ4¯qãœøl‰±^¨ƒ€‡æúrAq†»L#àÒH¤pÊï-Dƒ6ª„e’'X9ÍÎgE«wpZÓ*Å"ýdê`œ,(0\±2x7“bÄJXˆšE¢Ú¸_ KD‚O‡¾Ê6ØùƒzBw´ÆZj[™©‰êª KÉ¡Þλ=ªð ¨vd‘ÔVKW¿È.£›AÇq~~˜´¼À_'&máL¨ÂéMm‰fo$ l1¿¬– -ñù,—ÜC“Dx{-R)g[£ªIÚQÑ´TËöñˆ„x‹>u†k“Df¢`d]ÂK´ªª€-Ó³”ØäZDôH¼¯ —±V/‹¶™úoMrüd0®‰ªR(eAy6•wÅêÔ'Ô†O=i–Æ!¿¯*CTú…:Ä\Y$劕!ÍõÜ5¤pøó¼ -̲?úXaàJ”¡#BIxÞ´|"d@eqMé ACAYéU]⾘’˜l×v"‡Ÿ~Dæ18¯PÂoà”$2Mûb´n‰Xu&ÅkI‡:6¸~²ÚRæE{hQ"‚d¡ÐR«t7¡J˜ŠìÉz9Ò -I‚$J:ÈÀ.&펾RÁ”`ìL^B)‰H‘},5Ä(¦žÂDþV1óe‰Þ—5P§~}Àú1—,Ù&PŠ”1>ˆèážgkþ} -ב¢B1#£‹Y*7±qÇ1|ÿ©Š¼¸¢½ò èðŸ°Óí² -"BH^,.4 -±S¶
7QnļÉ1ëR€†ä½”ßobmå³ÈWÔ©úw%ûËÁ[¾ -·'ûé’ìkŽîm£F,ÒvÇ -YrÌr^¤´&Ç3³r}Êá«ü¥ØŸU)"ÏÕÄ žÿÒ@” ë婵Ì'Y"”²IXˆV¤•˜d1 ý¨°á›Ì-ìÖ”¨%_ŽHê;]¼,«Ã® --çY‚Zä&")‚5°BÜIlÁÄ0[ÑÃ`-réu½¼J¯Ñ.S -㺋œÔäÇ(¥„E"·.",Gè°5)c -l¯ž²˜és¯ÙŽ8!•?‰ÖÕŠÆ“ñöêÈŽÜÅŸNþ—¼{ý¬ùœräÇ‹E‰n0Qz&ŸN4^‡=+]žQ<N -éÒŒj=UÄžD¿ˆI8Å~æ$v†®¶éÓçå˜k‘xÉ5[›(S¤ZŸˆ&"Ù<\Tìv¤‰ÆO%·„O*³OIëÃpÔi^Õƒ$R‘›D.9\oSÚ(Ecí]Èê&@©$9<©Y—¯ ùy¤f4áux]¥$E=ÆK™b²`8QyE=²ÙÈŠÎJ¸3SÕù;ɶgW - w'†¦Z]b7!?;¡ºzS -u"aµ°S…|¥¦s5ó¨Ó!ÃQŽ—X€Ë$肪 -:D?Y¬éBˆâsÏE¹¡ä -¯Ñ×:Ä„|ʦq}¢.P%/‰¬ðÅ’ÚSžÚN"î_—¨’(â´È¨¥ -‹fY1"0„’DÌ •©„I#åÙ™%#ÐLl¾|%ŠË÷µJÅl7uœÄ\5*ŸaËe -Ê
Qõ§œ/¼¶í¶É´´?EõjXI›¤¶ˆ¨;î%ŠìlÒ:RéKb¨Ó$4ÎC… -c)ñÉkh¥ +×I(ý@ˆÈmr,q>\Fx€êîIR +rm’õfª6T4ÏK>~£ÛÉf2Ì\ƒÈƒ¨ëJÇmû³a>F +¥Z"Vr‹{ã\°,ë|$mŒ¸v*Ç9GZkh9ÐÕºÀF63m«L!ù +N“?ÀMîÕ§63žÔrT¦mU2möÕÃÄ¥aíʽQtD–Œí؃) +Q¸‚’òjØ݃#ðÐ@@&Oò·ËÂLäQÌÈ»|ÊE«d!vØÍ]©þDøW7fxèûÄú›«.°ˆ.Ý,#œtBSŠœGÉ’ ÐØÄx-Úñyâg1!ªÛfÙ¥xÙwlÞ?[9˜
òPãvSÄõ +Ý€FUpY®ñòš+¹ù>¤þ˜.£Æ +ŒSÍÛP»î(§00¹ÛJXÝhøºJ×VžëøµíÕÚX2ÂyŠ^UqÎÑfA5qõêÛ(/h<· ‡ÈfK4?WÕí +¼3µËÔØÖØ-ÄWFY—6ü챚ÚfYu¬zQ¢Y?4V ìEeðPO•¢Øu[kÝ7Öª‚L8;Â!ÄÛn’â'›ŸD£å<Q!¢( ç8òÔpTaçÒË’é×X†ß+zhØmvã +Iº«0»|7 +â’‹¶]›"²CÊë§nÎM&·´mÝ&¶)” +܈ƢÊ!ÖS˜UÍõŒÊ±*`D@t/voÌç“ÈÂ0Ùâ\—¸Q`ÇßÄf%Å9‘Ýa¤íÞŽ¨$3èx…j|¤QOKv££0|YÖžU/b*ó²"ðÎª× ©C£¥±ÏÉ:æ`šÜ¼Js9 ‡´ËgGãb“…§Çœ}&ÔÙ"Ÿ´c*'Síëp2II WÈq¿'N•¯¾K ‚ +ñ.kÇQÒ¥®:o™¢BëñöCíqŸ9 X7@–:“UµÕAŽ5øh¼Ð^m,ÅBjKX¶Û–ˬaÄòEsÂ(^ž§@)¯@.”âG Ž:@Ia;pÇÄÎŽFWãr)0ƺý€ÇÊÈÝÃi¿âXQÍh¢¨•ªKæÐ
Vq@rc{±¹u˜ƒ®N@¥¶ª1,ElPó°´%‡—ZËxs-ö-܃Wîºxðã +0ä}»cÅHì0ЩÜ⨠+(êÔø¤ôvÙ\ßØ’¾ãþ ›‘Ú +jt9Î>9è(ŽZIÍn±Å•DSà^,
N÷_ÌÕì+ãð+Ý{)Kh”ÇœD9Áñ¼ŽF“þà"¦Œ`õßF¥6&fŽ%k†6ùã¨Àè@‚±€¹ŸDKvK|heC2åû˜Á:›€x^\Ý'zRɪ›ÈŒæDEÑ-DKpGÅéÏ¢/݉j>ÐJõÍDÍh®É¸°,àhnî$÷l_ÒEõ²;1”“ÿÉ%ûÉI2>â\·’(šê.údoìÍã×NÉW/Éše€Ì3ATǪºa–p·É…(»=Ý®±s/$éÂ0-’ +?¥q‹ÔòóaXm·uŒH 7`{Ǿ³’ã}=ÀîïhÂ6Ymº¦ +%¥±¯OqZ£.d^©œM¶³€²`5!cðúh‰™¯aÔ°Ò1(óÂk +ZÌP5ȹzï˜9·mkÚ|q„†’s#HMŠ!I5ü©HFâŒnÉ›¤–YÚ‘«j·øç¸o4œµö° lçU©-G%„½6óF*»ÍOõ a
ô¶Du¼+ÖÀ*Þ +>—ÎDa²4Öd<ÉZñdëéQemá?~r¥Í…;Bô^£—¨’JŽª³*à°ëˆÄçf2ÞQC‘ØÍ¢´C²z/h^‹sØsl¶ÒºC+ªöÕ¼ŠF@…….Œ†µcôÆ…Ãkœi¯áÜ_r$e
?šs±Á U"½É|úž°ô)/SôìÁe:Ý _BŸµt&1ÁtpêÌQhäu7c¬¥¡Y붣ùŽ}ÐTãÞ,¼ +Ï«qÊ%¨uÛЫMÁ8û¡æ$Øc +aóÄÒ%»è8ÆZ,r$)DÎ V5sÑ#EQ{TÓ“"ï7¥0î4O¥UÁªüx=qjš'š›|Ñ™õ™j^•þPµ–R·(O´-E·HÛ¿ƒOG3<ý|T
Ê(Çj`èø”)¥– +ôP?**ž\%ã÷'RÕ9²ÚÏS†2 +Å[® @×n‘6ÖΟY•Ñ=we±pn‹
í1êi¨É€$»r,[¶=|ŽÂe'TA·-B¯¡'³ÆÊ‚:¹¤oRbSÉípˆ5Z×À¯"ˆ]YÒçULi5®¼·ùOÉÝÝA,nw}vórÃVZ$¹Û„^4Ž
+E +Ì&;xæWÉo‚y±Åê؉ð›V) +>Œ\>”ˆ,ž@øŒŠÁ1ñ}Ä( ç¾DB™<†ßp?Í%æeUBŽ¼F]02¬ãi´.²öµIO•·¡h콡;
!uXóöˆpr[g†ƒïÒ;Áy`iòêZˆE ´¦ÌwÅ\B¦7t¯÷"Ï\ß_CV ç½t-Xy)ZÁf+ĬJaplrð² .C•‚Lá +$cÖåò0ÃϤ>ïÅôü¸/êTªµÈ*ë§ÓbCLÄ!ȇvZ’Tˆß† +šôFpGfjŠûÁÿ(Ñ&‡‹¯¡ù|¥@”¿ß…ÙT§³MÑ)ÜfþŲ¸ÔçuÇ‚S ]ë#ƒdd,“"'Æ—§Éå©ÆúÂ&Šô‹Nr™p³2žœ'_»M¦¤¦¯ˆ¸‰KÕZïdëØëj'uZ†´2®Êì´5$Ä‚’cíÈ8¬„ðŒïUàbŒá6u°DòØÿê¡ŒƒÉw7×ý©H‹«„Ƨ$Ÿ¢›Òa`U³%\û/ÃrŠã½aŸç†^ëSĺJÜ—^P¹jiæv49š6„¢vH +uR"I¼=$§q¢€’ý2dîÕíd$Æ»Á·¢nWóHãzµÄ>»L«ƒL è“Bo J}öîÒ”±Õ”³×Êà«æ¬K@Øn‹¤<z*eÏ*>UԡЇ;5¥4Á‡À†-qBÍGó*'¤+‹¡WU7À©ˆ„\Ý‚¨n“AÞá¼ºß Ž\¬BÇhL©<†TQBò‡† )°VML'ë©„¢™m{Šî>Ò÷Ò3E˜[d[ƒ¤Ÿ¬‚|5¤}+n.e<™XøY?Hô¬(e‘á3㪸F‹(Y§…ë\ê*Ê(ô‰¯3h¼GF'£yV!
™pc£?YýI&ôÔAö‚¦ˆ–ÐâzÚr¾Ï's^)Rm€H¡ŒH`ì¯Æ.h–†a*G%ý…bRŠZe.Š·Š·&hs@ˆñKqÖØw/<
±p +Á8Î +Ž4 Õd/ÑÏÖã]æÀLÒˆ•i'ô†I?iæŸrQOC´”7„¦0ùÐö²£ÏEhpbÕ¶÷VJs€p"]MãJÛHkÔ†˜5Ê)eúÁ6™)ìØ頂 +û¦•â +¿0(èzå(ûKq²{‹µ„¼ÃLxÍ-9üÊ8ÒÞ\¢¢hp$Œx‘ÝA…ȆBUaœËxÅi£XÄG¨æÈ…±Y tb¹úÞZÂì%î8š³]´*æ´›˜z˜®L4»®
gªœ Aö›"|£ã¶8F§6H5G4uA{‰h«Ö`4Ë%(Ä+O:Ù‘ +SÐý˜R‰CÍ|9hÅéþÔ³¿ÏüT4Ú᮹†0Y“W¤lgØEŽQCÒ3yüØ–“,$k’Ë ¥¿A3¶´ä|ä,"b+bº£fuü–k]µ(¨œ51Še&£·êNÍê:ÌŠ?䪖_‡‡v4?kn{èsúZÈfæÒâ‰@Î‒âå0áRí5daX,!,ø_‹}ÐÌa ’ÜìͱÁ]ëÇB기YԩÓª}£Õµ¨U +½£yš"៦½»¨Ê”šglÎz”Àô9›§~pòÌ£„/ï½Æ•‘‡ÍÓð‘ïÍÉ]óEŒ‘ééòÈ@XŠ´Omð"\F~\‡åLs®5Xvs]ýI24ŽW¼6‡¢io»Ñ|œ+#ôê”ZNÙ…—aE¥¬ËJdÏ'v©.¥ŸÌ*,æ8B§ rƒ¨
`O}2‘d›Fç×QôÄŠÕ˜8A"'iÅC¨Úšl4¿C”¢™$È4RŸ]Y93M¸—ºpØi¢wÇscxÂs`€YÊ;mñí–¸£`¨Œ‰Li÷O° ~ý°Ù +¼Ï€·(w¶4$¸r“êÖ'R#OáŠi—œ¨¥¨Hø"%/‹;&øUv¸:¨ƒqg„BŽ¥®S°B0œß"
Èü“‚á‘Ç©Cå.g?Œ5^DŠ¯„DÏÍâ4Rà°MD¦Žl~õKXJQW×Yf¹9ØÈÒ8&ð>ÒÒ«ÅdÅ
N"]&AÅ÷{œ@5qFo±mH—OëØÐÓ**oä[ó^bùÞx0 ·!üRĉE˘Yw¦heu#s¼šÚ& ›‹ +>Ââ”!«&g€ùRR¥›Í®¹–¶öhv¦{Î!Të¶G{N)me]š\ö®ñTÓ…jGÝhܶ¨S"S2†Ú]¢Ð},$ðÔKÜxkð/,Fûôƒ˜†Qˆè€à"¶\1”‹¬¼™µÝ¨ëbô¨{ïÙ7$;!*›…Ë)CØ»QÍÞôAG¦m¥$ÖMúÔÍ¥´„\èd×ÍiŠO¯9Z[ÐftÇŠG³ýmœµæ>Gö6:ÓË'ÊÒ +¨‚6 +hÄ“‹§Õ\
Ç@s[Ý]Ùhnk<·T4›„R†Ú©ð÷fʲQ™qŸæx3Ë<bÞŒJG”x¤¥•(nkH)ªQz{VVd÷6N%…úp'b•ŒŸ8q®xí‘+(f1#Á +Xzà9:y³³ƒz=i}@{²'o;¯¦3.s±šÛrà¿M=Û울' +˜]$e‘®œŠówIÎ,Fì
¾Íó)º‡šá( Òš³ë™‚;¥¤’¡3 $ÉÎgf[ë(â
šM›lòS‘ö"'>¬eöJb|¶¥æX]³f4K i~¥9Xh6ëÈÐý$«B>dsBn_°—UtÎÂ×AŠÞ¤äíñUÉ*Cª:OSœFpu%J +CóÀžXú!µðûÿôþÇÏ®¿¼8ùøæöÓ«ÏÎn¿>ùäæõ«¯OþåúúŤKÜ^Ư?{ïïRÛÇvŒihIõçéø?YI›y²íâŸMÛÉ4=ÙÖüO·íÐÞû» D
?Kéa‡]ýœƒù-‡pñì·Ïº÷8³é¬Oé¬é¬é¬é¬é¬é¬é¬ÿ6è¬ù^Þ,¢«ë«“>µ‡-Ÿþ›*i}~ñìäç/®ÿãâ掜ÖÃ}ùæÔ߸ZXæ©ÒO¤¿/Ýl]m*IN
ñ2b…áÿeT™Ð4Q‹‹Xë9; +ãª& +Ä\tàSƒ£ë€84ƒº¢Ø
tœ)@Yö ï*4‡J¦´•©-G#…KçÍŒ#e©È§—(ÈÂñˆ=›[ÄڧŵèA4ÅRB¿É¤NYÕIãâ~;w|V„…Ç +¯Â34ÀÏW•J&Þ/¶[ZÿUñŸÚÂÌU¿¬&#†d0ëÜ9‰¥Âô +qºÿ£tÁz€³Q$²…*”À°È†@M²NÀ©£¤~¦HnözÿÖæWµÝU¨ÂÒòw•Û
^‹[!^ì¦Ëž¼÷óm›ž*©Å„#ž“jÂÜ8¸5ùÞñœ}UÍÝl,F·Ûä”'Ö½„ã³"åçŽÀÏ$ËAg;2K3±JÍ–ÛJ¢/–EÖ¶ÙX•=9*âWƒe~!F®òðÅÀ6ÐÀªÄ§‹³€6Bd‘¬ŸT¦Ôr±ndlI–0iŸvýÔ“‡gìé‘ëþÚ_ëI!øŒ{éTKÏX+mº¤ï¶×6ûèɼµ$.É°ÓæcÙúÍ &—å©JþÈ ’CCX«Ãì¸|Gd¨W&:`ý’2IåÀü’Û&%3 °ÀOAŽv
1ÌÉ”^|2ÕEÑÏ™˜õÁ&óŸ«ÀX +#—¾çÈïÌØñ´žRœÒµÊ š +ÁDc$NyÎ:W9û½xk©š½óm#É%ЙŒÃŠômÍ!c—‹-R¬°ÐØÄ©¾!<;
§€NÌå"gƱXÌ]²jÌ‚(d7#ME ¶Ÿ;QU
1w-„ËÈnh/Îó¨Î\|‘´þt‰9ì* E?È +BòlŒ6ŒŠmºz剋• –;ÍÍ]Ô÷çFƒL5„ÄÐìö8áPèKfv%ocÖ{Æ :Ûe]£ˆøˆéÚâ³.b¢>'Ø'Sç6%¨I8BÕʃµìa-ÁYþÀ#øÙvÚ˜E4{Úá˪,‡¨1Ñ®¬šÆav+ÌìIW8U`[˜äM¥Â(ïLâH¹?‚Ø®)N¢ìJ–K_‹Êâ^
Ó†NDcÁ +XÖâF¯³<É`:7¾)ém §* +PšwJåý€œ'2º ‰áÇXÒ*A†Ô‡*k`Þq?ÕñÚc¤“€±©Vd€8.¶²Å„i-¨8‹'Z©´ +à —ë¼M¤ëµè{êz‡9Ïcr`•zh.¨Ðä$8²aM–¦ÉžzàÊÚW/jbkÎ[²Ù×19 +Q ¨3ŽéSÑ*Y½of爆É5hâÉpðõÕ—;0íÈ®qŒº“Ÿ£~e—÷°²÷¹ßA¤7vê"¤ÚRðæÍ;é‹Ó¸Ð¦Io÷u¼_^k$õA¤‘ïwaY•ÓÍrêXdªìÇm³¶¸·šÝ£`sÃ2fÊQ¬2+q§AäAÞ”E};Îr +‡D²/-Åyl1à tW#@wÙ„ë“«L3%O‚· +F^‡ÙO#JP£¤›ö`4‹Ì +€AÐXr˦û,£šˆ˜ì³¬í9Q'Úqvç5¬aïËl”·¦}\IîAuBeR°Ò›œÉtºÜA‹ùÀzx T®:…xW„„ë®uJïÈë£óN¶r0*t;Ï"½ +ü#Q:öcàƒúñ©í4;
´–|Ôp¡Õ +wÏS7;Þ‡Ê/˜ÜÑìX×”t;F³áµt
UŽÀ.ätç]=
—µEäÆFôwµÛ‹ùÖð +XL½ +‘Á@ï˜ëÍ]Úñ—4ÉX)›å{j5y-û>ßöãZëØÎ,RÄå'å‘ÊJ¾%¢·ºÃ+^uÑDÜVH¥Bp®±®¢°Û´£‹ÞêÖ80t¥'Ü2•Hæ^ÆñL:bþ/ +a#&]HЧ +Øêvªª@ B +#Gšg2ûÉöû6SÕ(r× +vœa +Šç·³\â +D5Ütœ²’ò»BÖ€/ˆt•¥ªÃÿÒûcÁâ +nûJõ¿%ò„~xH
Úï@UîT›;ÍeT`"¾uš‚ ŒüÈ%èf`“ÔF•Š8@#¡§<iE‰¬i±ôþèƒæ(ùh¬%²aÛí"#¤"q/Ø7!)V1¬ðQÒ›§t
T4ûp¢eÛí9‰emM€<xNRuB#á1Q…%¶ +î'¦V0ÀqP«n1m~T}yݹ[mÏ5¬qäÝ©"=$€¨iÝXŸx:æ9è£X=I¤*ç0²\*‹ü‡Gpá™]ÄìѪF¹Åþ:îžÍ°ÀÓÉç¸e6ÛuF>;«àß&R ¦õ0ç¿nŽz + +T:ˆÍ%V“vmœ²~êšöR
g£@…|í¬kbSä‰&—~pýèòñÙ[–Ëjj<{‹«#VI!‰¹?f]Æ1521LØ´O“²9^º$PÄÒR\æ›÷i“k2 +zÅéC…_¸Ìfz ûµûòA¹\*˜Äp#DLGU…x®qÑ€Ž»Çû²™ŽT/…Ñhü‹÷²ÄÝ?}ë…ræ÷Á4#@õÞ:Ë|š•=ccø§½÷~Ø·¹ª$>‹3]7ÁA¯{£ßß[£sïsåúñï»1–YŒõè³û³¶aÍ?ÿ9áí8 TbŽ—ǸÂå½æÔk„$…½Lº5öEçƒ#Ç+¡£ÏÎf˜8êõ°‘#ˆ'Û›ÍzÐi˜Éƒ´àöè³ûcíÞ™˜šjA;NÙÒG$9Z'%v´×¨ýÉF+ê1¬J¯l4Æ哲¬ÝƒÏn^8>ŽzÝ5€øþÞwÇÞçàÚ:üýyW,>ëÁgŸ5:½ûü1/-.Õb9™Ëˆ"û¼HÊÇEI34PyŠ¸Ï›¸’&’MŽïO1/¢‘ãçC„i…Æ$æE•[<¯\¨†Ÿe¨Òƒê4Áá—aÌ#.˶ärŒLÉÔü[ó°×ïÌ +OÎ7ÓÝGÿ¡Î(™îžÀá@8èe„ú—æc:.C:éºvëˆÁñ¦ð7GðÄs|?¢ó8\ÚÎ~ +~j¥Õ…¸ÎA:dÊfžÐµ|˜C +‚:µ:Ë2âBžCÄ/N™-J¾ÆhÌ8Ÿ.KPU"3•Ön®ÌsІÅ>SL'ÀÏB}¼Üüj˜ìx™2ˆß¶øÊ:Ýoy ã…1"³b¦Ý°Æ•9·1bƒ9_ÌÍ:®tI
¦YâWhBˆÆÌÀÎàýKmÖÍJÁ@UÖ°‘›G¬S6ØË9¨1ç>ëÖA +÷¸å}ËÌãj›ŠŠ0êTWÞóؘâ¨"÷Sª”ýAÃ×Ä +¤UWKËSpKu‚Ó•é'üÔvâr´:ŸÅ# –Ï)ƒ0{b›îb¤ºœ@ŠÛUìfµîù¢¾¹8Pž;¯:ìõ^Þ,?³¬õ{™^¿º¸½½¸WaJ“ ž´‚–¶Ô0ç°Ô#›½Í …¥sÅPa:O(±‡Éô榽Fq1ÈàÒæ#ݤH¸ˆÚj¾O+ZøjÒd–u·jKD»r rªº¬<Hyªý ]ÑM@Q¯û°iâiq€µQ¿ª¢$R:VE +Xš‡µ2Ò$g¹³ø‘žòÞYð(⫈”±yƒS²î™wL!Ù¡ó¸ðÀäÄîD*Q@GÍ]ƒFXŒ@¾=¶@SlHçQ&„¸«¶§Ä)“ ª£5à—8j¤av(æ¥!;ÜÆýŽ·ÀJR©9èÖ¾&Ö’ù>íÞÉë^NR½Ï9Vç— O? +Î@a¢ˆ×ú~'ˆÇ2êbc £&wói½à¢Oÿ†¹©Î‹™™/mnÏÞ4}ÈÈ5j¤Nâ=x]£"D'} +ðWóº¨{ÖÚ^q ›wب›*V¸Òe€*æ@^28žy̦.ðâ’ZU%P^(Kiä +[5Lâ©Lþ=&ŠtΫnL+SæãÝ€‘GÑ|‘NOóÕ“9ƒï¼®C>²'ÕO.“˜C«T†ã¥Â~éc*Ðö³êO 4ó¶®ôÛª`•ŠŽÔ9 +s]žð±„¶/Q(’Ôvªrb—"Õ¤ÂI%(%E â©HÉ×d=ª ¾œ–ÄO0©BB +‘Mm +„Zˆ@¾é?e9·79†–½—^ìÝ;QRQ„óP]l¿ æÄKkȪ²¡…î‰Á@0ý–¼ë´p$^Ò”¦‰»ÔÅ™"Fl¢F¼zj¦Æ +”8Œº4IOÆG[«ysâvOŽ\Åér±Žû,‘jL]D=¼"½«%ï6ë%×}uˆ%œ,é«øÂ/Ó*ñ>dÙ–ÉÍÖ8m¸?=i!úQ&¼bd`Õ©Ö0œÄp«§ÈÒŸ&¸]àóý•ÝY%$§SYÓ¢\Ú¥¯ë±ŒÚ ý +9Áuê\èÀôPÈžZŒ!TdP&Sy·aAµƒKs¸@£¯p¨}Ø#œä9±jÄF©Z]Cƒ…³q… <ÉL(ˆ»O˜êÚY]!’IÆ!`²f”Ä/nS2®z¤Q•-¾%*冫žÄó¬Ç(ƒ?ÍÆþ”£ãëºö#XeµRb}Õ‰^ÜœTâÃÝ +«Hü³X'u‰o—<O˾›"T¬ÞuaŸœH^ÒïÙF,•J—º0Çå%SXr¬sê‚À˜œØ¼;—X·eðµU¦HTÇš©YjöÞö£–õšaÙ +,š*O¥ÐÐ:ñ.òc-µËªçk(Š§+_̛ͯ(˜q `¶„
¹6Où^––]¶ëNäeå g^uQû»vÝO¸ ”raQ—šJb—}+Ö~pŽª +‘̃\«Ú ^AVï;â¸äàÚÈCM~KŠQGҧ̈́g'R—⻋šìjTŠfœ¬ùEu”eW=,ºGeœôSIùIœJ—NCk±?qÎÃ|¿Œ¯&¸Ý,±Ù[ˆÊuÕ²N(,½öˆQo úTËËP2m!QAz°¤(¢h ’CöÀ0žQ•€+pyH^¯¹RJ“–& Ãix³$Ú".kŸÍáha*N¤ôHss¿ôl¸ž'7$zíRÊc¯QZ‚JwU·UáÕx¶Œ,a³
÷:']s´FE5ïÃ0-$Ý Ë‚âjñ6ÇlöÌ<Ø¥7—íÇílšíiÁ‘”X=ÄÊë +’ÂU!‰m+Gƒç9!¨ž«Âfòá̼̌jèç$Aq¹9RûwLMwFÅ>Ò&"žhÔQgnŒÙ§5Y× ÙHÈÏ–l¼R@ài‰N'‡e…“¼ãþ¸š¨øî\r”eå‹ïav”Š1¤#¡:ËX.âU;¯XoÁTòkËb
—÷í:ÁÈ%H´É$Œà¾§þ Åo‰ž!ˆÉ[µ{ã_úWë”Ì +KŸ’ÒÅ÷}
?2#^ÀÿLNM€":9A5‡Ž+¨bʺÚ'‰d!ÖªrOõ‚ÏA1C#)*ºÜí³„‘š7ó,ò‰d‰ÞË>:&ßkÚË]¹1)³&H™ÃÙG“B×D; +Œ;öÄt°C/ãìYÂoœ¾[C}ÌËNf¡-~gùŒ{²°æ«ù^GD‡XjQ‚ÂœË .'kH$-i_`K“Ž°²•¹‹‰G–,x×Æ:Úp0e(Mì»áH¹ù
ŒÀee€°IwkC´ež”Œ8J*<*—]ƒŽIB%Ë4°©uÐf€ôd +³ +AW³Ì˜}á%§c§”¸éüaÇ¥)Ý)¶+Q$È$’—`Þ¹‰‡OÄEŸvó(Rø0qÁ™ÇL
×Ådš×ì+R<y)JÝVóÍõƒšeýAÄæ +õæ´VX×ÔGfg—(¢¥íË"åî® +JÔ‘˜_I¶ˆ¿Ã«¹élÉ0‡¢o#!Á}\Š¡ßÖu›pŽË5ÚJæ—¨Ò‚ùÂÊ +lò‚çuv„E7uB'7"öPb·8ô“@Ç\ªs£VIxRJRéIG} +1šŠ–Èü§ç Ýe ` +@ +LhB²B‘w"wˆ +K8;=—æ<€&
¥LÚì +ì“y¬_ç˜ ÈO¼>7z©ûa0EÊdIRÀÔ1•Bòs±NŠžXaÜœÍÒ¾{èrn”\¿—·_ª +Û£>Û*ÍpÔ
‹]°?DÛ*†^þ;E*àd©@¿&̓QCKñâCj¿ýcÊö”ªÑ³U FpÓç Àºg’·Ã\YëXu¼&ȺîödBÞŽGØ80Ì€o”Öáv.DqvÀà§ó4‚úH”ßQ:¹Æ"¢9h +ºÆÆUìaÎíÏÓàð\ÌÇÄn¹&OuY‘>¿"wLCr_‘Ol¬„>W¯^ÕrÿºÖ€lL…ÕÖ‘-4?È.§DÒ¼H@å<¢FbPÕºSœpJJ€ÅÉÊ#sš·_ØK=ÖÿÇË +TÈqI$¹P¬@ŠI+XN‹ƒ½fi䩆Èù¬³¦ùÏs
ùéP0”¾+õ³nÒ‚>•:¨„—½²FëjH-uøt3HŒWõj
Á)´`’ЯqŒO&$ÄõAþTÝ.NœÉ0—3Bk5¢ò]ÉÅ´H:ŠÛ£ÒV¸šN“/Ñ3ª/ñÈý8öøŠzÀš®v¨>gõÈšm.Q²Ug(ý16ã[ŒbæŒê +W ÕqÕ3¯î‚?K`*¬JRƒS!ÀGíRÒŠ-{fõÒ1Êp
›”¸Dy!iÐÊ|FS +Ý#¹>töŒ·#ÍGVùRLýPÖ2è>fù[[.Àók%ž"ŽðˆƒàÓÌÆ_úξ#8Üw'¡‡ …kÉX”ÙQJ˜G‰ ‹j·fª8ø°¬ÜU+JÚeÎbÿ$úb +þ39‚
N7·®„¢Wå +vÁFpøÉRŸ¥Øx±—næýÈôjÐ#yÖ¥¶XFì"";‰ð^ù¡Ò«)Š<„Ƨ©¥›Ýû§½I3àÊr,´ð)IУÓLŠC‡²™d›"ƒê Ë;AÒÓØçæû dЛ9ŠÓ*^£èjqÁq¢]ÈijyÄyéòúÐÛ¨”òÑÆ"~(Ú%ÖÇ0ÌÒÖˆÓ0±¡ÏIßäÉâ!ǘ‡Ý3¬•WÂ3…µ™£’I¡ãöA‰”"õX¢¿ÓkZèE-™>GP`ñYK@0+Úm5Á³-† \3ÿd*®n+?ƒ‚V¸J\„Js+ê‡4Å!yÇÝC E¢¯#ð"#òD’1[B3-QÞ‰o?'Û(\꿵qc%jÐ2[¼P.»†ù&}^çÔæ¡j]„i„j´¢8Ò6ÏßÜŒP§ÍæìŶ•ÒHûÍŠ•Cà<Þ«d]ÊУFz]ãZCÍ
·ló£†z'«x×å‹xÒ0t¥„[ BcAKÈäl—Å Ëœ±4îsD³+› àœ½ÄqV·¹²ÛúnXeUŸF%‹«5(å•u·‹Ž£ Âà! ñ¹xbɹ ËÜ:¢Âg£R¶…rJêá’Řòa…Q ÂHÀDš8‚K +kgÕ¥“Hz.aùW–ÂWcö‡Æƒfá_HW¬Ì®óÕ:O*BÃPF–‡ÑÚ@2_&[z†Í=3ß'@’vEgžQH?¬¡ÚÌ$°š&Þ[¯xw{Úà"g³ +fÕ:©r~ÉÉäBMìåo)°àt ¶f—,\qP®%˜³35yy¯=œžmQi}hK¢‘¤x´ê £"y…°£’üôÛèdeä²²ŠQÕ,0s‰´Àëi¸ÆïžG˜â6.K>ë÷lµQ OâMã”I‡vq)oÏ)ŽÚ™+£ÛaÎô,öàN¾ižï[ºpA7cÅ'%Ž™$ÿm< †æz¬ehƤÏ"Ü×ÃlÜ£x:šÊbª/B<Ž4¬%òN8W
f]ËÁB˜!äÈn)Ž#K&iᯕUÊòÚƒ +ÜBîqxpŬfø“F0LU„÷Ö“ˆ÷‡WØâä +´ÁZœ»g„Gð/Ò#2åí iϺÐÁÕÎÀ*™c0ÍÚó€.]Ìž>{æží±…†ÇV©¶PÆj‹âÙÔ@Ó±x_Ù’¦tf<ÔØ9òT²—A@÷»ØžD‘¯¡DEÁ²>`ãEÎÁR‡Ç—o˜´/ŠcÂ9Ÿ¸¨¡Á˜…ÇБl0ˆ²‘¸3*Vj!ùÙ: +Ûä +P»/Tô€Sœ%ôx44òÚ7½Ð ¯k„Tí©=hÁÉ Sb0vÝK¡‡Å¬z(´xg‘Žø(^ø2dÈ»1è¤så¢/Fºk¤* +±HÀð›0wF9)C~$ ¸Ê{F½h¤Z×Q=°¸Hÿj}Š°®Ü +Ä9Þܲ‡zvlÊÔCï›ÚÅ3g$)Í9DñÃÅÓqpêÚïZèÄ¡¨fîÁóo'¶Î;£±·4NãöÅ\ÆR+¦<!HÁ%R{4¿té;æx õªíèK?ñD÷ovYMH:™HOa¢‹†º`±ëw¢ +è)a°†C]Cƒ +ù}E|S#˺©XŸ5Ž±Îfõ¥lzÐöÕZ« ¤©’,‹ÊÄc,&•t* Té…Ä–¯cI4cØ$ŒR{ŸUÖöø-³~¬Î2D5-%Ê5j“P®%Ã7·7hqƒïgro†\wÙ,0wÛ†ÞéèVË<çæ!lÜu +±hjÞ,=.y”¾‚±Ä[Ž'‚±ÕE›AT²ø-y§pPllÌr/»Mº?±Ná1cr-±êÒƒv %&©Ì.šF 5•úâæ\°Ô +‘]œdלgîxFÒ–½ˆz1^ìhd\ňsZÂÜVŸ1\䜗thjÅaÄÒÌ" Ý͵Ðk˜º,8SY(|!KÞƒ¸©ƒ%ÁÏ"aïÖý]Vè8V<QD¥Ç1eá´löfaS«ÈŸzÒŪÆÕ¯eÚëWÅ”}NZq`”¡ÑAÙ$„퀕"Ž³“‘á9œØ¤æý +:ÉF +ј$š1H·(õ«ãÜ̧ˆ±—d.€YzïDk¹fr»¼4°Ž;*qdÌñuݵ›ÈZÜ9”Æ°DF¡Õm²&b•dœBûÄfZ™¡Qƒ²º=mäHB¶×²ÐÄÝÈtªÑTZí&´@tF9ƒuÅ2 +4¶¾Ãÿ`X +å”÷¼Ï¸-ðÚÎìXåÆ“ám&Ôæ0€žVÞJH+m–›ʚ
4Àµ¸Ó/ýÔ¢¯à8Šx·F-JŠ—V@ó†žMÙ¥–mC3AÆ”«,59Ôøœ‚%ULÔ:9ðØPžÀõ!õà +옶`«g4Ÿ¥ô¶¥X–±LfYr™©Ô<Ê:ùÔxË%HdÔåÚ;($žTƒYƒ.qÎÌ }Ç©Ë÷¤!±ÊDŽI²B¹Šä 6ƒÄ:Q¶É>n-½!Z§²ÝØY/K[û¹á¨rH×x>pPסˆµØ–"ªVþ,³•Ë) +oã½wëÔÎ5öû\·ñðX3-”µµRÀ±»-šIòÆ«å{OȪ¿l/î‹Û?¼¸xõÞGÿ|uýWü—Í°yÿã+D.>úå6ú“¿ï£7£ç›‹øëGO®/_bßþüù‹mîðùmñ=¿:ÑÔúGý‘?ò÷}é‹Û³óßß/½Á/}röêùùáÏÜ\ÿþâO~¥ðŸ_|zãÏnzÛD\ß~~qŽEðÔÇ<'ß*«¸£GºŠ¶)?úéÅïNþá体÷úAœèNø³'ÿðÞÉGŸÝÜ>ð0Ÿ¼¸¸zö§ÿOŽœßÿÞßG¼ÿ[ü'ÆþäúêÙëç·ß2îÃ/þ¯/ô-& +_ßçéÓ÷Àé•fï››>Qž2Èór¨¾Yá€èæ”;2Õã.øõÙ·«oÞ_&ùx™Œ±`ηGød;ŸNÞÿÕ«‹Ÿ}sqõé³gƒkçO<†ÎíúÓ“ŸýîwÛù÷²?ƒÿþO/^¼~u{sv{}óáÙË—Ûa¦CsûÜ…µ÷úøè_žß¾øÎÏoüçíÍëg'ÿãä“‹o.^D~úüÕËgпâû6®Ï/¶ëãý}é§/o¿þàáåµ+¸®ERª®šé·ZB¯¾>{vñäúÅõ
~¾ôØ—z'/_¡½NcÄ7ß\¿øæâ㫯ôº¶#òŸ®n·Ž^ßüîì|?³ögô_>¾üòùviâoíîß~Ëö°·úÓo.n^9LžÝxõúòé󯾾}u´ÜŸ_}óüÕóm¼ÿxqÍOOãðþ×¾rô
>ó/Î^F?ì<žë?Ÿ¿úÅõ³‹Ã?m¿»]ˆñ…|wðÿøâúÕ+S?ྞœ½ääÅñgïô}Áuv¿¼¹xuq³Ý/¯ÇóêW/Ïn[óQ“ïÓßýîÕÅG²8¥{M9ßë2×ûMåþßo*÷¿˜øÔ_ßþæ~çéþ×î7¥~/ß{ÂRîþÞ¯ï?_ºû™ÿïƒïÚé§ÈNÇ7^`iýôù
¿†ôêÝ?üúh\lÝÞúÅÕ«ç·8úmþé³ëWœ”Ó|·9~ Þýß<Ø˯uŽêßï¿ýZV«Ï ¯ÖÑÌݳjÛžý§«£¿¼<»9»|µÏÒ?]=¿}~öâù/ž
ç|;NoÎ>Û6òËŠ‡;üÆy°Ï°Ðoÿù‚óñëŸ< o}òÛOÿ¿ÛÁõïУ~OÉ®¥J¥ +òsyÜ\šþ(OLøRÄ +‡yÙVq;^Äù;|¸±9?»¹~y}×ñâp¦?~öï›azi)ìƒ_½|õ|³·Å}Øúd[…Û"9q}þûÿxþêMÄ7w´þ’>ÓŸëÿ™ÞÎç¸ëÇÝù¸›§TÈ•Ñû¼‚ñ&—šÈt§bm')eÂAümÇ\~<áO¸wî„›O¸õ WÚÊð×\'òå4ƒmûø„[¨'‘ê·äé[O¸í“ýñ{<äÞ¹Cî Xx<äþF¹²lîìã9÷v)¾?ïüR{?žSò±ºóGC(?ð"û[„!üÛbÿßúå„œSz'¼åÇ#ò¿ß*û[<"aÆMu…층38å j·H^p&„@2¤QÊ딑ZHÇ¢’Ç¢’G Ö#Pë¨õÔzjý®Ê;ó~tUþû²¿UWe^ÖNÁ“<ÍAó´L™Õ%ešÐlø81U$¾É£oòè›<ú&¾É£oòè›<ú&?¨oò˜i~ôM}“GßäÑ7y¬p'|“Ç +÷GçäÑ9ytN“¯sòÓ³W__àA`7¿Êß0¼ñ¿Àoú +´X7è¸Ïcä[¿å ãžÐñrÜqáëßVm³eÞ¦æˆÎg×Ï—Þ÷üÞñÖÅo~²MŶW瓃)Y[ÊåxÀzO3nûÖ-‡[zÍkžsónñ<”¥
w‰í³X–âh~7ÛÌýNÃ6“d.¶mÉîÖeiÇÌÌ9æ·ìkSë~׃~çVkÓÚoëvÝܽl(Ã.,¤KrÇs{¨ãÇ"çlîXE\¹uó;¼ÆÙ©»Z°¶ñ›Ÿä”¶ÎÖ8¶óŸçMmrqÖeæ³—)M8ia«b±r¸›?z\¶wWß:¬%ž{jE,Q©´lרå£u$<÷ÁYð“yòcÏýp>·»€ßIÛâéxmÚ¶«ß“9aaª't‹?MjqÇ26X;Ü`ÛÎá•û²&«›hïã÷¿”ÛÊâãéê~± +æ´ô±ú·Ë€{ÎX…x7Ëä‡÷ºhr}0ÞE'Q×9v°úy|烧ßÎÔE®Ô²¹â|éeª~þÜx“ï§`œ³ýðhkœà‡×mŽ–®iˆƒ%oÁ›fŠ‰ÌAkVošÚÆ4Tœ„9Ç¡U*n1>ífe4=?L¬¡Ï&H=|MÛnNöçv/|ºµ/}ÁXJjK=ÒåÇj,Üv¸^S¼ÿr¸®JZ>e.‰ÚÒ´.Gìçöäua°ãÍ$Ú΄#>ìy3½,ÙNÄÎû¥çºêäžÖL;ÊÝlÿ†]ÓÖð+÷3è7ØûU¾-†Î“i›Íà´:_Û–ùqÔø‰ÚîÞ=OX
¥Æµ0M‰~ëF³<ñ—ÚvS¦VcG,ÞcPúÅÞðò&ì²VÆ,gߺ›13sÈ55ZVÛ%Y¦£[fŠó¬ÞºœåŠ1ÕƒuQËvuðÃ˪iÞÍæÍ°¡A6ìË÷yÕ|{cÉ5쌃ÎcoL‹&”çõv¢Åó¬>îÈ»yOö¡kêKci‡ó¼7+G=ÕíšÐ±¶Ü†½&žÌû+—à±þ“Šý¼Í²
†:ÅêÈeR×ë:)EÙVÉVm<§¼Ž“2ÂvéðÞŽŒ_àt·IÖâÖܶ[æžË¬Ž–¼j5³Û«áÀgI‡rÃú˜±îzZØõ'_™òôùÕÅÙÍfó˜’ÿ4.åÏ»¯cÀ g/Þ¼ÛûŸÿö!–ï9ÄòfCü®nïݾÿξ¹x…ãíÅÍÕGè¿ÿzÐÛ¿¼¼û
vòÙõ‹ßŸüôúö{utÿ[º^ߧC~ÂJºm¼×¯_"ºöÙW8зƒŽsÙì®”y[‚Ó‘ç<,üy\ćP [l.G†ø[$m‰kýžço‹ÙÅòÇËf>ôÞ.ÎŽyÀQPÂã‹nßNÉŽO<ïú$e]äʧ²Ùz4ŶWw,b=Åõ°Ä°3¢âðJñá<L›Ï £iÙ,2yæ›mzäIû'.ù<.zÅz8² K«ZUs+ + À9íá;ˆÊõÀtÆóç|`3¾¿m¼?¼:?CˆN‹ùä«÷ÞÇÅ1¼6ô<©uÓ†URÔ¸Œ;†cPã¼[ðÉÕ8
MÿÞfküFÛúý7ê0É~£{úà7Æ·öýë²i?ûdÄ×"Œ¶Ö#nïýò¥bsüKDçž>u{‹<€Œ¸{·*é8–~”P¿ûcïßþ{`”9éO_üáòËëèæÿB$íõÅÉ'Ïožm¿úäÅõküÿÏ·ý|æÅÍþÀø·m¼z…\¿Â´|à~·‘öúí£óLýôúü51~zv{†’¸øwVÃ…š·Ù€í§¶•çbØ“¹øÏÛ“Ÿ={~{öåó®¡Ü>ÜBuý~qqûúåÉÓ³«¯^Ÿ}uqòÙõË×/ý… õzñø“³«oÎ^}ñüúÔftngn|j=9»¹ýòúìæÙÉ9ùrò%Bcêð[?¦¿—ƒ¿ßÞœ]½zyvsquþ‡“¯nž?;y5~2í½ž¼<{yq³ýñòõ‹ƒrÀÍkGBáÛF•OnT…ùŸüŠAG~vÛR´}ôÓ×·/_ßž|~öj»â¬sòùÅ«ë¯÷‘ä~ô_\¼úú;¾‘ŽÞê³xQÏ·OÝ^œ°æÜ`©oýðﯮϽ
î+]²øèûÿú‹‹gÏ__üà¿Ý˜yhuüünñ«mžU‡z‚‚:½»$c‘m³ws0il{öòù‡wF}öâù«±8\–ùòúöΧ. fg£ÔáåÙ3¿ÁÀ O>~}{=&öâ
ßí¾6¿sóŸ<X0ýúO¹M®jYÿïx=ŬÿyùâjûÀ)þÏÕ˜Õ‡ÿþÍÙîêþùö/ã¥||³]I:2ŽFpyq{öl;YÞ~ +?ï°
˜œsŽÆäœsN‹œÎœ™ß³’mpÀ6fÁ©;÷ +°Ü-µZ¤Vó¬Çñ,CRG¿ÛdMÖßø˜£ø_rÁ²àß¼X$‰=öËâ¯ÿcð²]OÿŸPÄ@ª‡Ûy:ÁC†ÿÊ1±»¼¢®{zÑO§×i²¹4 ¿¯—U=å—C2Ú=ÖÙpþË7’¿_Äærÿgço¾áüEæä¼’Ça5y<^׿lDÝŠ¸£š®À6ÌÍ×ây½$ʵŠðáäþKFö<€‰¦ŠéÿrEû=mó¥Î3¢„l§3îKž×³aŠWòN³—m!ï°šÞ&·‡Éx[™oÛcD«,°Òt»>þ™ ùß?çù¼@uÜMÇoXoœ‰Hñ? +‡ó€i¼ŸRóî`g¨Èd¢òmƒ¡r体bݹ_+øçðŸùùôNDŠóÂáv…鈮óÿ^Ù¬¹‰¦Kð"¸9èí¥¹ZOW¥óa±ÞΩ»Ü`5-a8LZ_׬.o[Øôø5™ïݼ±õ{àj² Vo“ËüŠÀà+0PÉìðóлÉ|ÆÚ“8`Èê|›_±Ã4w˜Ž·ÐпÏùVï£-¼ðœÆ˜-™k0¦±R²Äê4YL†$ÆoÛí=ÀÙ ïÏOï°ÌŒÓÛœpwÿ"¦Îd 'ýBiýßù,-ò6U ˆ5Ï[3½æÍ?‡‰é—<ƒnpÌJnS‚ÅÇÛíýšÛy›O[‰otžÃ»Iç°Ëgqì—Íú8ëw#“\ú© 9cÌþÇîÜyÎ&éýâð‡fVL´K”ªà>=¬Üþg¼Ÿ‘»)OQ}æ¼ÃWŠIÁ +ûSmô,¹ÀË”vä;dDÛÜ å\Œ)çØ¡¢Ôú®=ÄU°M•%žšÅ¡DŽS¹Â”ÈÛ¬ýAdÓ€A=ÛŸhú‰xì9!šH˜çÓKïœxE"½Én‹’›ÕDÚD«OˆM +ÿS'¯¾ &O·é?2ž*Ï€4 +9¤³~HüÞ?gÀ0ÕÙøy³¾·•ûàì‡àIºB÷ÖMpK¬\
{콂ɚŒµ;•heVÅf…öGcZžz,´ &T‡–.ë¹F±ofˆœÚ냕h¨EÀg.cø3ÕæÝ–7<€§‹.WvÚˆ¯ƒ)Ÿ>‘ÏY#§ðÔOäð‚Ë®¼MÿùǼÉd}èzvSÚg|Ѫ!²¯—³«uïz!6¿„݉ÎE|…Ÿ9»Ð;Ü»®µÎéMÞŸ¾¤Š‰‰Åp‹fÛŠ˜É}Ìè-w±ô,–¡±mdkmèÄí6_öèyš¶ê7Þ>\òr`΢ղÒǶE2j=õ‘¸zõMrlaìÙ±X>âN)9—ÿ<ü¢ÐZˆÂ<Ý!òYêA°¦ðì9Ž áÌöSNÍ•V×—#ÚBë„è|^Áãļ‚ÔŠÕôá7®9x,ÿ¸šÆ>rÑ.=ð‘ò6¢B䪾Q°¢´é'êKW,:ï«}–$¢ o»ˆ6Q= º¬ß„èËòbhˆ±—øAL£1/×AIJ+•ëÅ=G슫±ßê.Ä© +d—A1@ÜÖáñDòvÄ‹;Rˆ¯Žÿt +f ªšn$Ê‘p#¸D"{«‰ùtï*†HBuV"xéAR豇¤‹G’5Þ¢HnŒ‘BX¯EJ*W)O¢k¤šÎ;º¥UG·9Ò:Hg\,½VÝÊÛ2ª9
ȤQ©"³ÖQ‰,f¡²:Œ¯ÈFeI!;_û„Š¦$rš6OÈÕ`KÉ‘ôø&Wcy¹*¦PÉ5«V]®‡-rãÉ-ù±_n·æw2Tîüñeäž‚Z#÷ûö=yH=È#çöI_Uªr|uÈÓýôVžë¥Šòâ,ïW¶å½¼~mÔäm€Ó‹nåòaÊ';€yáOÛäë: +•#¼Rhד¦ÂXu¥V{Û£pªìz…g7¾(#ÿB©ütX!ST¤ª\‘kn‚ŠR¯ìPÔ~‚FE[¡U+úÞ£\1.ÏŠù²ºSüز?2T±¯ÄWŠ‹*ºTÊ‹á…Rmˆ/•úAr¥´ø³?J'Rß)½½áIÊe³ª•){Ô¨Ìë›NeÅp *›&_RÙ37JʱOÑU.òÙ•r3ºÜ”ÇkÒ„"þ[P†¢ªV!‡êoêj-Œ÷¨ëÕ£‚*„Æ,‹*š\•Wh>Ô¢U·)‚¶å×:ØnNèìgíB†£z\Lw*d6v¨Ô›YYeRíŽ*‡[îWùJÖ®*²Žjd¨*éjdUùÖf¯ª©AU§œœ¨Æ–µCµœ;»ª=Ö4©nFmSº4jãÜÜR;}“Ú_ö÷Ô±ìÁ¡N«3u© +«›kÍQ=¸òê…«Wïré¡úº‰„üS‡‚ˆÆ´ð¶4.¯Ë§ þx®šîoiò@*jjûªJÓ맚Yæ˜Ólc—æËʵêØ|ª5Çõ%;—iËI›<amÉ´™i[™xS;: Yí:TX´§Ç©C±“^gRu:W;éÂ)ÇF—²+纲ê0Öµó¸K=ÝfÝïꮇaW¯Õ.ûz›ç0ÔûSò‰Yú‚Ûê›ùÖY?–_PýOÞcÒ_å·5h†Š˜Á†§†€ñÐ5$.øÚPœ^†v¿d7LGö„a7Ù4ò}mc4¢!½Ñí3FÑ©iÌncÃÙ³G½fÞ¸1UVÆÛ²c1écݼɥšlM‘Õ`1eš¦©‘(Mãl=eÚfö[³<c˜•ÊÄì™)œæø-50}W»¹SÏÌ€æSi0±h4Ñ€Å^Wl,aç·d®%…¥±Äš–IÙî´ì^+šÖäd¨ÕZКÁªveM-ykýà¶Y'ÖøÁºO•6ô´ŽÚlAµÞ:$¶¶l|жµt¦¤
‚nÛ)§PÛµXuow9´#{Ü9ªÛKîXÆÞ÷*#öŸÜÒã7‹ê0_ãzG0àV92m½ÜÑÒ)¯Žy[yq\ìÊ‹S¿Ñ]Þ¦[îLÆ㨳n.jSãÒâ<tn—N»<ÖQÊ…ÇÌUWRº&[ÍÖuò¶Un]Ïár{µ3è³ä Ûr7B¶{v>èÜ—Ô-ùbÓH¥Žžl<æðtBþ‚güxňÍk›gKÞ˜ªqô–«€w4W‚õî |ºu»ìóárȬpÒמ¯Ž¾u-ˆÉP¿2»=øñ$îÇ0õÅ_Ãú9ÿ¬™Qû¯cK3`Ñ(œHüg(¦éÀØÓÓN‹Î(h·ãÁn¦
Æ«ipØPfƒÇŒÓ2$³çP›ôC…¬.vò`öCÇõQ6ã›p¨pÇ\)<Æ
Xø|{#æbÒ‰ºíêHUƒ"‘ÙnsŒ"ƒþ&jw×ÑĬ½Œ6—ÍEôG=^ÅÔÍOÌ[¾íbÙ£åÄ’ŠØñ<ÕËи© ³Ç£¶\(^½^3ñÅ$ÙÀ”Ûs,S4™°~sÅŽ£|5aV…Ö‰˜G§MÔ{H4±ÖíÚ¸ºùsÁýæ•/Ì7u|R¼^’ˆOL:žA2- +QW¢[h:…Â.Ðʦ<î/b‹Ø•ßÅSb£.ÙVcE)îÝJÃëàZFú‹[Ùƒäå¢WƒÊÐòBïÒV4æ’¥¶ÿ¸+
9\ÙꙪy®ªW“æʤ:(j5DÞÓ×<µp VòiŠµåu1©ë¦
E=ÖÍúêj¤\?×ü›†s´6ò«P¾±P%~šÚXÕ!C›Ñå¢ÞìxPyó¼%Z®Tÿ§UÔküå&?mëGJwë×'í~×æé ãõ¢ã[åšÁwèìÚ\׺¸èºYûrÐ
&¡ž68EzqtÝéõ&ÇPé›T2´ï/ø&ýz¹šëj[÷À1v)E¤³¬ÝºúÐT¯'†iÕ=œ¶Vú‘Ö‘¾â{ëf4è^§cezÒ‡#æ¸)UÇ·t©<ñWJ¥IcÖ(MκIeê)\2tZ½X»ÓC6=ž¹ËŸYyj9Ïv®vîÈXœóR°›oãþÊž:MÅfë¶Ø,"ö¥ÝfO/‹UÕp¹¹•½¼÷¯Jæ]cµÝœÏkGOë_—ë¾îz_ÈëóÇUš¦ª=ýîç¸L7^Õv¶i`Q÷æòso‰²gÛ¾Yç;ykÚEÕÝn`Ã3{µÆ«Þ'ÔÖÞ~j¶·ézȤìÍÃj +m–¢âXªGǃÉÈГgržšé±üŒØMósÄÔoœ‡:wò¢EÞÿ/ôð{mŒó(äèŒÈcoÙ{¹ç\Žãý}Ånu0NÄð +‹å‚ý`KƒEñLºHÀp¼D.Y›Y†Fü9ä|o”¹Æ–©r.pÌ«À
+M1“I½|B•›µ>7†£>w'yÅ~ú1GÇh +répJº®¦«¼‡t +Å6Z—‘bÍÆ,g±öyÌ<¨pDß9C,.ø`@@!šÈPËDžvŸõ!<@} +4Y²yÜ‘Àlm[°nË¢…^)8Í`À?û)ˆ™|tÀ+ÆœÐ(–yt OwÀª V`£¹ƒø͉İ!Ajè©;\×Ï4ZÃ~ôØÂœ=%Æcµ2æšÔË6Ek«é5ZRNóÑšÍføïmxgÖI´FáÛƒD$ײØt°¡y¶¦sê>aí¶¨&f=رVRø›äAÈ241´ê1G+ƒGÎçUÝáË7ÃÄyœë³LžÎ ¼.)ÙgÒýN'rb!(`xéƒ7
Žm1KÆé’–5 'äš"þÚUe®·gRrf’A÷ûÄ·ÎüäØÉ´Žrét«xç¸FuÔÆW®J'1±tØü|6X€úò?:B’ãAŒ\2:ÌX nG8\©Y–þqɵON¨§zÚe£ÅA,ÇÅšÌðøl×&„'Ï$c[W°IÃv]s@…¦jŠ §2ôb^Ä’tP•D„Ʋð5Ͻ嶛‚O†kò(Ÿx½z¿£À¡ˆ?}9,âëËÚ¥¥±[²ié=*ÿܧڕ\ÑBöÊ냙NæŽtÙrÌž¢9]ò:œí¢ÕQ3¯ƒœ°P§\ÑZþ°Œ4jé1žð”[24 ·$zr†CÁ†«\¾˜ó›71ÝœTwÄÙŽIÁ¬êªs@<ÕÑÊö¨c¶+S@ü©îÊJgŠfÛÕ=0ˆi~>ŒÔܪb<wªYY*C§ÂQõ€¥*8>Ô"+b@æîç`I9'œ§ÔìÃç–¦a¼J4yHjÓ b¹ vK©]vâ)Å[—gphlRòٔ$œZâ)ËR·'›×ò4¶ÍXLp®ºôút{Âk#Ò˜˜Ý¥T¾bêQ» +Q&lZå nMÆsø)XÜ´Ì'¾°Õ ‰‡¿ƒ‡ýÙ’ø
~A¡'^$¾ºª9[>
o?Äáo1T4`ÄÝN#V±
;Çl +&9`Ø)HüÍO +–9ëF| +h¹Ý•ÙvÎHÛG”[ÝöiP€“)`ÿ/y.Ý#–Fm˜DP¶‡FÀP+ªã+};n^‡‚>j®Øtbù"Àö&œv„cÎA)E µ+`ð Gò<ÅœŒŽ9ªÉçô(¥¶À³ í¶õÏè¨w3ÏÆÁ€fz|4y±dÛ½ +<±¿l¨wç¡f?`Pš»÷4—‰•K0–ö®@9ø·6-ª
ÓÎîhf?¨,îÍmR²ä²“#í#sc¶ÎÌK|ÕC|úPr8¼sVßfДmòz`Ú—ôšõÁHË ¶±úÁ#`ñÍv[T"Híí +aÃ.F«ÉÙ˜—àÙ©#^bˆjn¶9d¹ñ +UŒOßK~®S"ùLÏä51‰é42Ô—×Û»ÑZM…°˜%œ~€ÍQQ*Š-r¤¾í 0HJÇ£}`"FÒ- Ç0CÍùˆ’½õn¢‰ZÔí,½ŽQl³6Š`]%qo¨=Ì3à…ÕáM$:6áµ½EÅbÛ¨¯™˜£-¯§‚=‡ZÒH)3EcêA,›t¸‰sݹ"¨
3ÄÙG°~í +à"t¼4ŸÕƒpm»tfÛÖi0[˜a³×Àܳ +áÃhåd¬ÔÇî)põ…öðf¶ØD·F½¹Ñ9€G·{9åð˜}¸•ç+ÄÍ=,›
˜ISÍV®ñ„u¡Á}ÑŠü>¡M
ü5³+ˆGC1ztbéñ}’?ےЦ_²Ô„eÓò8–ì0ÜJm<b¹Áœï'8¢3X[‡ïxm`åØG`†=°vFK:—îš{pß»Š ìÝ7Š~\“ÞE½«^Ac¥|G \šóeÄë8èµH™Aàm`{xQwU‚ÿ©HÀhÒòbTI,îF ûóSl¢M¬žÐ\&}(H¬\bY.†1`áÛ‚Xª¹˜M»¨ñ‚°ª33è2g£‡UQÇôœÄV*ÁöwO”ñÁ÷.± +[ +e1“˜Ò€É.Ü52!>Îꮺç1Ç-<ài3|r¢ÉNãÔ”ØÆ~~J,=+_±ŒFƒÃmÐ4¹oÝŽw„i”¸ªÒÈsæ¬ñgã5ÇgÁRfìY1ƒ|gˆ–uC !§;+SgnWKº›pÖ5` Lk¾Â`rÃGÛò˜ý±™Þa²Rpcˆ¸ÎI: –M(‡–[¨Ž +×5{
âÃÉ̲–`6.:·o ¯Âý =w^ìÚ½ŽqÔ¡V¼ÖfÖõ$/Wxl +^ûF<¢ž×Ø›q.b¡æjŽW€ÏLv<µ^bR‹6±¥SµæH¯‡àºË¬‡–&å5% b.d(±_u'<ZŠ}ùËíÀ
º\'«·‚Mãã
¦[›§î€=1OtéÄ#<I4©‚_Å¡nß±w“„Ø"(Vê¸k£”ÇnQb[²,µÃ÷Ñ<П5mlã)…q \õV›Ñ7HiH-ËcN-nrlæÖiI=¯)(*S´«G+‡ÜÈ:i7L—Ò8¦ä†~øû.ÛŽÎĺ··tlÒšWÀj¥’íáqDÈÈÇò ücr¨8ap#®pË©00}Â@DgO1¢K÷訬¹B~ +¸ê¥™¬ÔºGà7—+,ƒ,,ÌVWã´ˆ*Gsnö£ñ
¦•t–{lqèë‰Ðoüšõ1Œ×’7ÓqÍv´zöá +GŸá{u§T—QºüÏï³èø²õ@¯%Þo‡miƒ-Éâ +ðº¯ý•:=Q”Ûõ=ÛšÿÆ
˜ÁäûÃtu>ìæØá¯=yC¹àõ? +v/½ÇˆKQh0$¶=˜³èÝaA£__þÜö›=à?“dŽ˜ž×Ç·u}…¼6êï‚èm2Üx¿‘íksnþ}Í óRÔ.¦ïõ%®õí¸ì8˜‘»É.ÎúpáKâ|z¡ÄD¯ç☠5FU¸×âqèë1>'PíÅ¥PÂ5;¾Îk«Ûn²¯·RÆ +é&ľ¡$÷“t@Ín/WÓôp»OâýŠ–ô~ó–TdÜÍâ†éÔˆd×U„ Èz‹ðîÖû31dæ/¼YcúsäÖ‡³Å¬ÏëôáÕÕ?Ù²ÏþxP~|"øíáÚ5†-¼ÉMJQ Ž±…¥z<µéƒ× +ÑÚSAÄhVWd(¢mˆ¶Ðñ"†Õ<-Lˆþæ«"†|CŒ–¼Íb¶5z'×–Û%:‡máâ(dyìWǵë™ÄqEú©%5œÇeèù +N¢†c!Éz/!O*Ð4ᇎ£‘8÷:¬ƒ·kx0œZuQ÷žÂbW–õq£®ðå\BÃ%d²ç¼J¸§Àm”»œÏþK
1¤-fG•Ý³‹¿6lƒÃFe™©¬æ"
öÜ·\ +åþ¬
+ m,ø¢P¥‘Y–´I$ ²f†5^¤É”&H^['TH/Nì9mNîÝB9ˆVû<«š¶½»µjRÇቕr–…´¤Vs:»á‘FJs2‰vxî¯ö5¤‘±Ë+¼HáQEiJ†*í¬¤Q¬æ~¤å¸6tRîr|Hõþ/D#óÂf%]¸)ò#u´ÛÜk)ð"•ãK·²²³ùÊPÞïãcu)ÐÍ>B:¶$
£?Ò¤%ªžkÜm©åøª0„)¤m£†CàpÁ¤È›èmpÒNÀ’s©ŽƒT†^ä©ùÁUm +/Òª_mDšWí>¤Pò;ºFKu¨•óõ"Ϧæ…nG«áEÚPï—‚H««òhB •¡Ïcí&-ì1À4gGëx$äGzÌÈù™Ñ6†IùU€ÀÝ¢¥ÎbüHó¡ÄpPî÷y‘ö‹›4ê—ç±þ´3\ +RH¯a=g¤HoÜÕ’Hcmkš-
çK=„ +ó:8Ñé$Oœo#“‘%nÏrJ£%<¤.ôsºüHíŽ R D~¬{Œ9VÂÓD +UÞT錉ÔQ>2§«2ÎT*”°þHíòBëÿ1Òä–…TÛ&¼W&Zƒ6A¤„õ/€øƒÀúÐHÁXXcí"¾8„‘Bë_©…öÿŠ¬Ä$†4§DJØ4R¸öYh¡MQcÍêÜ{GO|¢&BïÌvRÚ
n»=sí´t)NƒD«ø²sEñ%-b`̽(%-Ÿ–îH³ƒÔ©04!üv¦„‹ªá¬xóZá3ÐBGͬF9ëP&‘þ~è¨
5ˆ7¥ü!zò&»\ãÄl§E…>”@©?†üB@˜ÀwÛô.x$q¢O@ìÅÌ«9†>þT˜33+>cK’9ÜQ&LÅ”@—ë%ðƒ +´7Ý:¤ÝN‰cÆJ*67ÐaKƉ¢ÄÈM¶—Äש7Íé³KÛ°nÞ`S‡-Œ8'HHËþ-–}Etø‡ê<éÌóŒOŽO†Ò#$þÎà}þªò×ó§xŒOGñß¡ñZ!–ôù;üIz‰%̪‹ýà‚ dRØýN,¿ñ-΢ùŠ¥‘IÎJöNïSž—îÀ¸éPœü1åm±Ž7#Nw™0±Ø¢Gû,z ¶è±ŠÙ+ÖMôÒg&]fPEŠ~Ú
àm$wôÇ0(ÚY÷ü´kA±-´*‰xïÐÚò÷‡ÆÔbÄàìáF-ÿŠÔɬŠÚMàí¦çŒŠ©Å£š—L*jöŸÄh`iÞŸ„¼Ü¹ƒ¶eÈäó‘V:צÉp´Ž•êÑ2ÎÿKÂX„µôê Þ9‡ÁÉDP‡˜U*0>PÝ»<ºçu7Æ¥®;ñUtåXÞº‰Î¥Âj¨[
ðOWÏؤxb 5‰,ßtŠ1'þJ¢ŸyŒï!Ÿy£X~t‰Ñ/b,×$oÏBÉÉEhËüZ7?YaÏSB{|yýó”Ì’¯¬0©¢gã¹ÈPAÅ$Áf¤k¦{TK2ôùMBš¤Þ·žøÖþ,É–Ó<ÄÊhÅ+Ò¥k8#¨+‹ª?RL:Ð%aƒî>u2TÚ/_Ô°xeó³fpŠoÌ_²´£A‘œü°ê^B¿Àª”ŒPÞí×}‡—ÖwbÞ$Óªû˜bÃó)Æ–hoöëÈŽÃŒÜç'ÇõºüÒ:fí¿€þ¤øœA!ƒ–WAÛbòBŽ1lþUy
Ë¿¶*c“ò=G™Ü}šÉÜ2ÉÑ´žøûÔiËUR‡mÉ¥NèòPË/Ãü†aŠ#x×Ëëi +]Ä]<NG(N~îÊ) ©#Ûòw4y±ì!}d½€ŠZ¦`èºû†ONnJ²=ÎöØú—‰‰ÐŸÒço j +û¼%ðyžbãð·O7`ïúe¡> ‹!‰–Y¬óâ•o1“ø÷Ä, +¢°÷øÄ€‰ŸÃ’6>"Ö÷*sNòø8‘«çõ"èæ÷»$ùø"r%Ö%¾”98–·’æ$Éšç(}¶ç½ªë[GAÈóc¼‡AÞ‰›Á>ŽWµ +ñ¡É$&»±OB¾$8Ìù§c2ÙMhÛ†í%½JvöOÅ7Ò2!z„åš¾rCœlV¦°4`ì#XÖ盉íô*óQšÌão9½Äªr{'vá#”o¥˜¹oy‰Y‡¯}{@,¾½ì‡=ö:{8ÜxŽœ0 x·Î{hö;VIA³K0Œa)qóÀ^š]’óøn¯ÎÀ¿‘Ç7y•ÿ¢`„SÓ„“`ÄMéç3ðêàJ!Ô©_Š¦ðü½</ùÁ,ÉŽ`òΟÔ<>ÏùUNŒ3°O§C`_Ë=Ó;B™)ï +ñÒ)Æ°~H±—i¢ÒIK´_QŒøµÅZm#û SŠs°ž'“Kš-ûó}v³K½Â·Ï—〠+”Çs#¨`×ïóáX§¡î憎ǽw”̈ûv>ÜË[¾’ÇÚ±’pÔòwùp\_Lh[f²}žYÜ×ÎDPì3‘B¶¥”3‘ƒ¤3‘¯ÖþecÿÔˆ$>ÏF'à^;D8RòH¡öç™\O'DÎÀ¿–h0¹N8 ö|Þ™QËFàijú¤{:ñ¬>½˜Î"Œö´Ÿ,C:ùˆUøt`¢×ÊðÉ1ÁeØ>J]†"Ö8¤÷{þ"/£}ç6`Î{ËG ÀùJ"$f–¦Å^¾Xà6-¡cÖÏW¿¼
•æÜÖ¨5<Ç°`ò™øÅN/êGFªUþÛ"Œ1],ü«ŒÔ±|(!‰TbFêX>‘2x‘ê÷•ŒÔÞé;©Î72Ra¾Øç©Ê72R!i×@s\b¾s}ľ4õíCFZ#5ûìeØúxrRáøåØ·Sáˆóü¢'z¾‘ +Ç;/_O…û}Ü’M1qßý
¿òƒT8æDD2Üÿ$Ž'ªð?H…ãIôÏÚb†!S0ïOK|Z žU•r#<Û‹›^¸ERzAPNIE dLøf»7m˜§K†ßÝ\`d£·%náˆÝÎD9ŸÊ£±¼NnææÕõ¯Ãá*‡{t”G=ÐëV3ðá£æ€(q*®’ÛÆxˆ)f·îUFx-TJDÌW5üx-ìneñN≦\µL<fšÆã1s!¨ïêݲ»LEœØ¹X|YgÐK¢r”ºÂygž²¯Äd/v²›ZÌ3ƒÏ¤Î•
¡;G»%–ì63"µàµ˜X†Z\çÇBHG"H“F/)7˧¿0¢pÜd7Gk•{T&䤀É5bÉnV)»Ÿ'”açR(N®[O(Ù+–u¶Ï°;Ôj‚HU¹ùj&„t.^¯ÜFš(t“‚äUîíþ¡Ò2;ÃŽ˜U°`©QŸ(>÷IlççkGFX-½œ$ˆm‰lG©Îœ‹Ç-ܽ¤~ÛrªXìX‘[¶«ß“caí•T‡ï¤ö¼>¡Êš×±:Ièc_L¤S¯§¾:çAz¯ß¬$ÇWv„çN Ñ%±JroEẘä#’/²!‰;!ß8×÷ªˆœè¹>éüô¢ˆœàøøê¾½*6"u|¯k
H&ú«:#œ»Ô>¨'}½$çÂ…ˆ»J-@'éýM6Ýïâ0ïfÓñù÷Zœß˦“x?̇Ùt|1Aîzù<›Ž/—î·™ÂÙt|±xþ“öŸdÓ±ÈBYÞûÇ>ʦãõâ†_dÓýR#¿™MÇ·OóЕ_˦ãË¥cúûßɦãË¥“x¶çl:¾Xû½û÷²éøf—ˆô~5›ŽÏ¸ažýN6_.ÀmódÓ=wi¥¶”~›MÇgœÊÐogÓñÍÏi¨³é¸ ^ÖþU6mùÝl:éû$›ŽŠ»'þ¥lº_Qìíl:Ñ«¯eÓñçV;›Ž +ÝIÛ<:f¿pÏ•=\·ŠO¢ô<‹ì׎(³´Éýë\0´ V* +îòÀu/ϾâO˜FgѼ¤D:)'še¯3…qHÎ/XDŽ¾qˆRG0ôÇædi¶ +€zy~Lòi( +Uí¾ÁÂk›$±SoÀùÂ-$œO«U“Pî‹ï†Ã÷ΪÖ%$2¼µÃ«Õó,Æ„DIø+ÜÝó+…jÜýbò®ømÝê÷*܉e>~°ïŒFU¸ûJ¥¼—ùDÒ*å}šOô¨”÷ù2©pÇÎK’’ò› +wbõ^a»÷+ÜI½Õf?}žXÛ;ÑfŽ÷*9± +¥»¢í%áõ‘‚±Èñ£]p¬–¤¢SDªNOLK¡:lZé#“‹&pÉic e§¦]Ôn]GÐÎÉrÔjÂÝ-R + Ì9ÇJÃssÿ˜äÍJH] +ÔQÀFt–›7AšTº„‘&ËŠR¢î›'ÅJä"ˆÕÌ6„‘&uœu² UÂç†Ç'* ó¦šÙ³/Ðη¶cæWZF:_TD½ïpMÐjŒ¹íàÍ*ÚÃVžq‘8ñCÑI<6 ˆêÔ»A¬*f¯NJÐÍ +té)¹_IöçyTŸå“^‘í“¢|Œ±ü‹ò=Eþ'Eù^UdûNQ>2gDÜ@ù¼(Ÿå± +¿^”ï¹>òÿ¢(Ÿp}äoå“T¿ò“¢|̨ì”K°S‰^¥Wõûün¨Ì7X×OÒÝP×õcíwC Õõ{ïœÒoëú‰WõûÕÝP<uýÄ£Büžøûuýø™Oôn¨_Ôõ{ÍÉߨë'~2ä¹ú°®ß«L®/tE«úÉзº‚uýćƉ]üº®«#OUý~Q„·®Ÿø€øN¨þ¦®o:¢ØæÒ #9S–÷.è_Ôõ¿ùë±'þa]?QE'´Øêú‰‡…ߺJ¤®Ÿ¸«Ë{ +úuýøÒ$é¥÷Y=¾/伿U×O +Œó£®Ÿø†ŠL2œOß¹©¿ëÇcj2ªú1«3X>¨ëÇY†vU?Ö]o§§Xuý^æ½~¥®ŸxU¿'X×OüÀ5##õ£º~tþ/rî¹úu]?qìêú‰¬µËÆþ¥z|:q(’ëñ½(''¹ßGuýPx—Ï»ÙOuýDò^ž¶¿[×OÜ’‡7|£®Ÿo<ï$þ.K‚9ßI|µ_ÕõßofŸ"ø}]?6µ¹Þâoëñ½wHC¸ß–Ï£ªßçõø¤$1½º½áù¬Æ{¥ø¸©ŸÕõc¶Ÿªú‘CŸ×õ{¤J‰Õý¸®Ÿ¸™#Àco×õ¯ê÷ñMT]¿c}ëúIÈ{ýB]?ñª~o×ãûU.GZ>×õû}2<£ªËGuýžCÉ̪~B·œ½[×OüxG‹ýº®ŸøA'NLé×uýxæ…QÕOü^8éuý~·dSìýœ'¿òƒº~´àâ«ê÷ëÓƒœº~¢Á¨ +hÆûÉJËUˆÏäó5‰˜/3?îUlJ‰fÄ> +‹=æ±{üóv_¹ðblëQxÞÆ£`# Œ»'L×…mWÌ|ðdèï!Ö-4DW=è‹Gë*ÿ(¾rgÑZtß„:Àk‹uuŠµÝ¬M;mï³Q³ÓŒ
¬ãcŒú$g ¸>Ö5íÀo’íaðCK~ËFâ y•àixr8Ö±§ ’iÛú·@~ÚG.Ý9êö >÷Ŷ]daK0_r.1§65‹ ’%¾F|…[t•ûWÌݧt'<p¯eœŸM®êËëí]âEbV}…¥_®¼ýd$Tf,ÏÑ`»Ä6˜z „(†«´=ЇÎ/òÞûp[Z<a=»#§>>–¡.…¯UML
c´–¹é)²¹l·ø1ÎpÍA'ÙDÌè÷ûòú;ôÏ‹=¾§îF¹[sñh(æBN,=Õ_,¾†|¿`4ú‡-¬Ùö6>Ë—Ãñ¼©«ÇGša`Y./Èc˜z,="ñUwz]ö+ÁoœÅêu®cÅë J?uŸ”k´z3©b©švDÐNç>êBò-@ÀºKo \3wµLÎèÕZ`Ú75€NÕ²Pš`ýu[A²—m{
+Ùy*™›…ˆÙ:Câ¨d4õt6Írl*:¾Óés>íÜUúÄ +Wä~¥WAÕ§ßÖL_›ÐŸp@À?²ëéJõݳ}ì=Nd§ü—çë]îWo´Ä\Eþjë÷Šµ›p +÷_–NT¨±IhÀmÉ*qO~äé7@Ürj$ +Î$µñM N¡,O½xººóW} NªP×~2"L+@J"ƒûõ0ê>3/Ї#ƒ÷Ž×ñµc3¢ÕGõ’ ÖdçÁÚ˜™õôõQ•mÀlwŒ[à>2?D)s
+…*™ŠÑ¨ NÌлÕÞ;õcÕó\ºDqàxèb~ý™»™DÍ9‚̯ƒH˜…Qnæ-{ókNïg~¸ƒÌ¯Ë`ˆñ˜F^æ׺ÆÇä1kr`bîx€ùõècÂŽ96ðÎÃ̯®\„ù5\‰2W%P(³+“¥ÞÇüz´2;2Uº™™ƒÌŽL]ñ¡N›ú•mkšc?1ÕQpß°…)»µ_sYýÊÕ%I¢ß½ }5F˜î÷UIe„Iþ0ß`˜ÈÄŠR=‚H`+'‹y|òÜ#ðÐ(…ôŒd$B\9á';íÉ<ãKÑ×Äé®$CC<V³RÞÃÀŒ–íTùfpûѳ& Û¢Uz,Ö´Ú¹[Ã<²ÇòП°Y
¾¢—q¿eŒŠ¹°áØF‡$
`xr±J#/–ÙqxSíÜˈL<dW!7³&E#¹—T¡<E@e^—r KÖg5C²iîAüÆéÎ#ðÚ^Ä}r|‹µ¶Ö$ô«zi}´þóþTÄ‹mÌ¡Û=>F’ŸC“Š1@ºÞ”åyu؆3oÒ®ô¡.ójáÙFþ™ûÞ‘êX”Ýéðå«
N6%¥öÊ1"°Õ´¡½íÆùÐÖ’£ãPx:¬Éø2jÓîjux¾Á äAÝOL"a1'BÓ
ÛF…r^ãꤴd69ƒ\ÉûŠ”†v$¶7«YTvë*[lÎÍ +ã¶Ûo>2صÃp?ADÆ|ÑÚÈ¢®G
ûÊ*:-¶PŒ–iGùi13ß=¤¤sßÐ-åÇ·ºçLJî8$yùÏ°ÉH.}ªSEH Ùs>â¹m¸CB¬M¦'|p©P·Á…&¶ƒUïv ñÚ!37g„»›Bº®-µ=»û~˜t“ ¥@¨mسNNìúÀhûθ(ãtèd(J‡&«‰
§ü¼T¸Ec|~€Ù +ôwÃÍ0L‹Åb7§«ãÖM`„¯k±ûÑRÄŸm-Ý +-H~{,8¥Èc +g”flk*¢ÆÓn8Íèˆ:¬KB6 +‡ ˜&c°ô¦µ‰
ñéÎø¶þÕ—y„7|RaCÈz‚™kŸÜ©™äÒZøÜFìÙ0œþg|Nz• +c|ÕM¨¨@$ëÓXœF!Ím³
ÓHÚš\éÜŽ´ˆìp@E' ñÍ#WÃNÄó^]÷öÞ.´žMkD +Xh>0ȵ2ßOp]’<¤kј:¬)ñæÌëP¬Jh™:FÔ‚…ÝÏC]j‡’?a5X»)2 +ìûÝ=¬êÐ2- +°j½6›âuÙ«GдeßAÄ2n¿hÚQ8~ãö‹¦-ãt׸ÕSÁ˜Iâw¦Ž=Ò¸BÚT–lü{œ¬ø’iKÜö0ní1†qûEÓV† +·_4mÉóÉ]š…ŽLDÈHÚº,ÓÖK#Pà¦mÂ6Ò¶|À?¦Ý37q–iKM˜—¬o ÛB¶tþ#Œ[ +—¿øÃÅ/î¹—^ÿ*|òí¹Ë×îþ õߟݿt!ÿé÷o}ÿàÊÝ_îó÷Kç¿ü‹ë?\L“+ü{éü?þp6~ûû÷fÌØ +Øï=kÈþ•§ دüt!û§ +Ø›wôéCöO°™üs!ûÿß›{MÌ‚MÁoμÿã[÷ß½û«Ûw7¯î½¾wæìï¯Ý½yïÒý[·>¼õ¿/Ü;øñ»[wn^Ûœ9ûÁù+Wšìèƒ{7om˜Õ‘?¯+%W13ã£ìbšcç.|ÙÿüØ_ûË}òæÊjf0øT¼üÇNŸyI,nßxáÄ-ÿ—^ýú›ðë%
+.fù!7õÉ—_¼pëþ¹/¾òÎÕ¿_øË•>Øqâå;_\ü᧗é={9¿†Ö&_ÿãÜç
Ô¿¼õ§Wå׃ӺovÃÐdÃñ‡N½ñׄ×øO}AÞå÷Ú™^=õÖ[}û…Wþö»¿ÂUñWüáO/œ>o¾ðê;_~áå^¼„ýñŠnÛ¡ïÒõIš|ïÞ°0è"{õ«¯ÞÔ'ü·¿SŠ ü»‡°Ïè>…SÜ~úæÖË没öÒØK—_±__;‰É¸|Úlelf»…ìÞ‡c«_YéIkºã›õÔJ[½Á›|eõ‡¿?ÿÇñ‡ó§×»S,kºrf½m_ÿêìøû~Q¯ÌÁòç?¾¼ÒÆVßüçó¯®Îÿ¿ûÏWö!_ÅöŸ¯P¿Ÿ=øæGùÃûž¿Æ?]{A~}ïåÞ×™V+c—¨ +¿¼Ha¿Æ˜ÒÕ&‚â]YÚ÷Þ=£ÄÎsÿð{ùõšW&'çÌ{ÿˆS{Ô‹”ÒÆ?øäê¢C~>¾…ˆÿTfì™oüᵯî¾tíÒÓ7+:²9Nvø'–³4]Á]žðîùåŽGÝOýÊO|ÇaªóŽ§ÞnëíÏ—ÞzéÖ‡¤ä
ÚçÇ~8
?ßÐe tºsýÅ¡²ÝH+ç +^_¼«¬McÓ~qíŒÁþ‹¹×¾eWÏ¿/þÞìW‚¬Õ7=ÀŸÃ‹×¿?÷Þ….½ðòþ§Î÷w¾'ïòâþᇡ«½ö¶HÚß_O¾ùÆç/üë}䪃ýë»o40¹Ëõ·¾?õ¡h²gï}ýîËv¼•¿Q¦>üáâ©k¾¾tòàŸûCø“»ôò©W÷Ï}{òý»çî¼uçÃó·¿)g.\¹ò÷/½ðêÉ—&Û0‹²pñÑ'N_T·•_ù +y™o|ñéG_¿õÑ—×.‘*i,JÇŃüù©GüõÆT>-7?•ÃæíW¹ˆ0 +ìä ¼öÙ»÷à)“óÜ©;÷Ñ–«\>wÑíx8S`zÙÌÿü’*gÛK”mC|ïží—¿}e˜ùÿz€½³äöïÞûÃ<Kñ¿ÿc)& +s:¥Zâžu1ù÷ß¼©†þT*å9ZûÌc‚ñ»ol5Äù?Uãÿè,êË,Úv~&CÿaüúëÃ7 +—?~¢î@ÁìY:¦_^dòßÛE7~€/Yâéä’%>Y_/©Žvë›[¯˜GåÊ£hVÒK᥷^øÌâÉ毒~Ç}pæöÇ÷Õ¦»ýêk¯0
2þþõ‹oU¡šöRF·-Åp¸Õ×÷™ Åß#S×ß<Ïýy¢ð[le“»Å<Üï˜üw8³dÞ5
‚»ÞÌ@ü¿Ï‡àÀë2AW¼¿~ñî͵ÿïÄ ùàÖÿÇùú¹[_ݾ{õÆO·îïùþÇÉü&oBΛÚùÛdŒ^ýbï䟼}óփͥ{÷7gï?üâÞû7Om®ÞÝ;qýŒü~áöÁÃÛ÷îÞ¸ÿÓæ5}üÎÕkW.l^ÛØç®Ëç®/Ÿ{}sRžÒaD.;…`Äuyòë{nsVþûñ¿÷œ=üò“üò¶üðý{ãÝæÍ?>s››¸ðý½Ó!´Mî›ïöNûŸ®êO§=~Â_—ŸøדwOm^þÙç{Ý?æqå¦eß—’7¾W}„ÕïW׿Ǫñ¨ßyýS>ZxÜ£µºcÄË~Ƴ…««hí‘ö‘§|¾ø¸ç«÷Þ„õñr_ý~uùÝý}\¿û»]ÿ”–÷h²û%ÈNˆi?ðá|Kë‘««‘àÇÈøÔá‘ñ©§|ÈüXè9·ßjÞœNqßž±®®®òXðñ‘Cö‘§|¾ò¸ç“õû>\*ó·«ã·æJúÍ®|ʪ\ÝäĉâWùÃéB,~àŸžò{Ûã¾76¿‰"|¾ÛKE¦»õÂ_¯.¿ž¥î‡ª…Ë
èžò©úcžêê9=äTà)púôÏœ‰‚
«sáÜ·žè Ð^òûÍÙïå§w÷ܾ1ú²qûÁ'ùY~ðÞù$ÿ:ù¿(¶ßsii®¶´úáã>CÒöÒ€µ(N¾ÛË^$r¿_¿<õU½|ç×yõ—òرÖÚð(ÝõØž)D_›ü{ëÏcå»Ï§õËòܼãiŸ–‡Á/W=Ùö7ÏOéCx<^Ç”¹Z]ÏÙüa™³T/¶éá¡yyýu>ˆïm¿áx°/?ô»]þåW*Êl`bñ`0È!y®ÝœŸ²ëm™žù!ð—'±«»¶õÅ[ŸÅs½HÀé6gÀ’ +¢zÊSËä5‹}¾DàŠ…EìØœÄ:QžG?÷«˜Ù›èäÑeƒèæìNÔÈP¡Ãr‚ä¥ñS(ûÍËdëH: ¦>Vû¾Q C„Uˆò^¥pkå·AíÃ;Äý./¤ßVåc²urØ-›QS =eˆ³™–‹S i{/þôô‚åàËÁ3 –ƒ§,G½è˜„ÿ‘}(ÛÆb95<Jí>BƒŽ
B^;5Jrò¾Êk(à‹¼nŠfÝÈ£";R¦¿g~eßOð{[ìMGj”¿áIœ- ŒõV#à«Ã›;ÌhLxQsÔÏå(G|‚€ñ¹ øÀ˜ \ø¶ŸR¯qð¥ŒMÕ’‹«=bâkªLé²õ²[Ó°ž"/E¶Æœ‚JÖS6Fªìq/
“#ö¡¼_3?“cú-NäR†ë¢#D0òb@V}(Z¸lÁu’Ǹ£C±ÀU'’+„®»)TÑÂe$;újEvÈ“ã÷f’£î‹uˆÛ¸à0U®hb¤F +ëîÇ4ÆÇŽ’'½Ñ±~Ñ1 Ct”œélI¹R@T9oèÇy«±Òx*©zO¢êᚨJß”*ïMt@Ä—@Ìpo7!dIqÁdBuX!ºK‰ÈŠ·¢ŒÃ@J…€–ÇÈ6;ÁÛ]š‹²k +^Òw‹!S3´ùñ.²³)\)ãª(FºÌ€˜6B8aNÊøœh.M^ ø}y<g•¹N‰2(E|¬ò¢Ú!€3 Ôyl o +ZQ—R{D½lŸ†ç9rbyQ›ö@K+žB¢¦àÕÏ(3¸åa¡¸Øò°èÍ!£åH +F€˜è‚¨¤hÝ—ÅÌɹy¡ +Ze$¦RuWzÙ%‘Š‰¬g^N‘¹¥äÈrÈUbº‰Î¢Ÿ“i©òžÉ8ž¸U£èQ`ë‚mðe7Bm¢^FD³¢ö«š +¶¼Ø¹²9ÞÜ• +Ú"
@È«¤âò·^Ô&a@?ÓwJoê>”ˆ¢RÓ¹¨ž¾Ë…-Gö¸aËaøB¨r|ɘ(6Šü"§0r0å·ËɈ‘$šÖ@¾< +´êh@“jUUŽ’
jkDð)b¿éHH‘^y¡0ð‰˜àÙù1ˆý,_‹ÙŒÝT"Ñ$suNeZ™‹íìå!årBŠð1ÈF ±êº‹fàyðˆv3àÉ'–u¨™Ê“jCñû3¦qY5þŽ<W/j“`ðŒ>Óx. P9¦ð¤^ÖËÓ™¬®Y‰Œ¦™ðláˆð¬ø’¼9"œœÎpCqHP¥±2æÈ‚øôX% +sÞðé«lb|‰§Ð+òL.Á§ˆÅªø”é¡ôäaoø¤5$ëÒJ÷Ÿ4WÝðvi«&ÇG‰ÇálßzQ›„ÏØÕÎE‘ÔµîšÆa¸`€§jE·+$ß„É·ìP3§øÌ•K]ñÙ¯*¡wŸ^—Æ[i—ˆØ¢ÎÌfºNXÊS(‹G`$T‹ºxxQ…—¨&} ³R|2FÃk’œD§œU@x:å;Sz‹€“ã‹j„TÄi?b‹@g£*Js^Á)ª +/f =FƒÂ;‰r³•’e,A']äŠß&»èôÃ…oî|ßÌ›{Ý;ùöMUÙ~'<43xŠqÒ‹½žž²áœE…mE²U¢.RǧNOpŠ.0À™ÁÙbK›y\Ö,—C}õ¢6 œôºg{—dYÑ<»Âs(}6¨é>á ;4,ðÌÐ0³ò%ž ¸ËIsi°#°6àߘ?)ÃÄÏi¨¨*cJ?‡£XNÅJV†÷6‡UÃîIæ¿©Ò)ò09Ò/¸ŠtC0»ÌÀY;Ît±ê{Íðø"f™ÅBG¼ì!9®GT½4e !ôäÔ\êOGX“Ÿp’|yÂN(N™í°§|¬ûÅ&ç,.kFÙ{À¹õ¢œ„NY%ër@Ñob}ð‡¸ì@§FðãåMZ3AàJ®ü`àD\ºE¤Á–äu¹6¥MƒÈ +“RFâB@¤N'…$à +ŽüœA‘L R&,¾NGW>{c±ÀJƒ)ÀoNb³’!ècµÐ$c‹‚ñl$J¹ÝaÉ”I:³Á¨†-]¼!ƒG ôEO_$ ¨zñ 2aI&€ ‡‹ÿM"ª—¼ +ebA'¢R¡ÚåœU'ËBCKäHИ]8;p”Þº)”)’Å ~ª3Ÿt4´ôócÆ^'¦J†÷l˜òÕ'µy5T—”Ý@VŒ–žNïKJŒ6¨Œ•Ù®Õ®(ƒÃÇ`õu|ŒÄA°‹ÊóŽð9R&¢mÈgÚ”±‚±F´é ‡çöQÕL"!¤D¢·Y³r
fÄg9 +•$‹QŸ]oŽ~ä¡1"Lpñ©=–ª~¸’ +sQf|(út‘‚ø—•Ÿ(G@q$H>(h~²<~¿-œ¾Ü‘&!ç…F½ª7ýsfîT0^ÁÿíðaOî,XV¿ÚÜGYw?ü(Åë«TLA`Öù¨mø¿½ú]0–5XÆNÓæw§ñ`(…yãI¶#3Xˆ;#Í3âä'ÝNcò=Y +PÐU«k©Œ@Ìrýù1YÁ(¯*cÝi(îòªI9jºŸúqMÒ¼"ÐäÉ•Öà!rþ|àU–TÕgjŒÊ+_£bŠ"#÷–Œ%0–Õªàñ7SFj’ÃÜòÀzÂ)½ªD<NÂôP,H*oNŸ2`óä<Ô˜ß@ »ÞM¡‘+Ÿ7‡]Á$Ë™”yÞ³J<™ñD&¤K¾ü)he€<RXÌñ¢`ò2à0¶g`"ßnžËS—óFÞž¾]l"ÀÄ[&¢Ì¶óÈÜDà¦êV—/ÊÌ›Š¤WˈÒ!79ÏEªœl¸•‹®¤Ø'Ô"É%RŸ°¼ò|ÍÒàžN23¡PE#®L<íšÿá +¦¢f‘QÈS¾µŒÈ×q=å¸.ãs`ˆÂm߸«1^AókÝn$ÁBæ¨},ÀÝM½Ó(iô™t5¯¼ŒŒ((twX¡´êÂÀ<´º8|»Ø˜Ïžf¼½ÊO™Lª±ˆqQúáøÎCFÝC~2qo +×·A^&>bBÜTàzÄ|3Ô7f¾êHkÉ iIþÂ5u騑š=“‰è[¥V±Jb˜E^¯©<ص0Ù«$K{ƶChPE¬óŽ!·c9˜ìWrÔm«¶ +©ž2¥¡…±™Å´6³ +'P“#ÒÔt 5"GHÑ2
¹§F¹×b2ÙÄÈ#œê<g9Å‚^“‡”³«i\(7ãq6x¸Þð¼µ4ÏÇo‡T±ìfÕ- \@åjš.‰H2l¡ŽpË<Â4½¨=(ÁjQà "uÔ²D‰†Du„å;·=Â`Èñ(ù
‚OsvdQpd˜?ÐMª1>´ÆJ–ýëæð[<U#·]ÿy¸°Þ‰ +mN̓ғ’Ò"R3F¥éne6¡ÒǵMºfåôâIìDÀÓæ¬'µ.ãTŒª60â”wI +Êá§?x>^YšÒ×VRꘀ„—0.~1FkQwý–þ(;~N‰œÎÖ“ò0‹j—vd0ëœËýÓPÛé?ÆXÖuˆÜäxÖ¨¡çí‡?øu¼0RY??B-ÞÞ±‡YÔëàrUM$ÃX£ó¸C]èjbÕ¾žª¨ãÚÑ¥–ÂæÌ•»Y]ÉoÎÞ}xûìÛ7ܾûÕ;·~}ïæV¥%Ï‚NVi«ÐßžÏÍÝ‘7ÿUŸüšyòýëÑvâ:kÓ¸ç‡è©²¤öóŽ;¬àû¹"8ååµådáh³•µ‡ š]„¤Ý¤×-ŸÈCjT½j~CV¿Þò{(\õ¨:[?óûɳ7ï}qk/l.~ù僇§P ì¾Lñæd·ùÝè5ׯÜ}ððÆ݃[×/Üxxãú•×ß¹ñ½^²{S·9sîÞ½;›“÷oܺûðÖ}½ì´Ù¬gÞ¿uCþxóöwï~ùåƒ[?Ñ?û#þô±ýiÜðû÷o|÷`ùº+wo?¼}ãÎíÿwëæ|ÚÝç>{¥_¿ø¿·~Äg¶ßÂÿìýû7Æt\Ùœýñá½Íû7ÈsË}— 9tÓw¿xpëþÿܺyý/·~º®=XaÒ˵wïÝÝTçÁä6ïïU“o÷ýÏÇg÷Òæ½x?»' +iÔñ9§á(d!g±1¯ª*æÆ2’Ží$ƒó¾9aá7À×=.÷Y‘k^EO›qIŠWî'¬ Æ#þ8ŽÅ}£bE&¼“2ÀÉŠ<¥1bˆ‚g\]eOàòª‚ª¢.œ?buïì}¹÷ò5´Ý„ꪎß/-߇*}ª7A%9M÷¹á)ªÖ}:©ÐQ<A«ÃU)©¢m3#}:üè{@RnUU#›Âoc>YîFÌ~_-`N'½‹à*;_†1(hx(5bx/ƒ—'ß~½Gë;bÆP™ÛjŒ$^ô‰âÁR%“óB?”õÐxz[j„¥:2Ûx/ÐT¶ÞΛNïÔ¼~WšqŸedùº9¶<Õ¼Ó|ô×;ÿø9ЉúhïÈY?biò¡‡:r¡£a2ç÷aêHОñ£A¼‹ô]¼ì”øûåe_þ´ÿí( ]ZÏB“S„‰òvYÍÚÔè}ƒæ8gCˆf›h%Õƒ1¤1«¨wƒ¡¼=ÏÈã´Ùe¬æÒ¶¯jóx]¿ÀÁ³®ÏÁ3®ÏÁ3ÏÁ3®ÏάìÎÁQó´5›H›ÒÁh—©‡CaÜ+l¨ŒOj²‹qDô!ñÁÜ&žäY^”ç+2GuaལúH§s™|êg„ÒÄ2_™N®äÊ9…»´Ï` +é`´Ô6Ô‚Ç_Û‹Ý…SN#vÒbeHƒÅ¨†qŸÉIã|ª&Ä0Rû!r3ÜYåC®²ä§g•Ï&*žQT<›¨<xüØL=§ÚCã®PýcÂÔý* ÈP&“‘±dNr®CúXI³\)ŒÊ”cpÞ(˜½™Q~n©êgP³
û +†t3ÚHÙ„xK&X2 +p«×h–I2Ä;+
[ööÅüάa@Òu¯8 D’‡ßÀíàŠS(Å0íFrøÑ4h¹aÛ0
¬Û‹ùÉýŒÃBb
ì´Æ·JA¨P³’Ž°t’Þ,"¼d¡¦ÞT…0£OÞä\ŽÃ)J&†XÿÉ>šIwÁôújÁ,eJËâ×N/(öq‚Sa×ÓíQ#1ÉŠ8jœnåÁìÙÒˆYCç˜oäÝ9°™zN•”–»BÛ>.Åd·ækdè£:ö Olì +Wü<¨}ÚÝ +Å02=—Z7'³@QäÌŠÖ%«°Š¹h9lÍÎîÂø|„B~ÌÀ隨çVEi¹mA¼Ýà©BÐRC082PC…¬Us +dr‚ÐY¢EÚ‡¤íy8‚T{MO託¼ê–9M˜õh¨%ͤeUà Šžf ¾>?*/[¶”2¯akÕz†b%JxUa9ê~ñàU¬T'„YÁd³¤¹P&'aY Í&=Þ Ý›©çVLi¹¯›SRz=Åu²µë¹ª¦œ”B‹ÐU±²ù„‘ÌRÄ,¬Œd…ðR ´àLÏ&¦U ÈV.a(9ªdoúˆæÁ¤9€4|›EJÒýĈºbMg(DÛHßTý%ËbtRs°ZV_<YyÄT‡'wwÆvÖËÕdz»s`3õÜÊ,-÷e‘¬,ŒÉÁÖ
³)”hggŠÃÁÐU¯KP&íÁ›kf¤u…³×ôº®¹’ +5tzµÝïcSYÇÈÖÌî¬+ÛslïÎÍÔs+.µÜ—šéÜ1èSWç
Ûe,]mÎôŒG*‹váÛ-ö_-Cáî†÷Bò7·3d2Óœé@é&¹5Á„’ÛÙ1 Õø©rÇùQõ‹¾ÕW¦ðÉ„y7ÙN¡ôŽá[É8ˆåh²›U +(G’|‹ÓaêaSß,jiªIÖÀÂȇ'xgyG9ÎãñÝ9°™znEªVqúVý¢›ØÄ$m¬F!fш4„pQÃwB¼Ù]ûðꙢ“æk³ð„ïÅVÅT›ŠoM.'À¡ó¬# Y«©bŽÓÏdê€ësà]ãÈS¾¢mXWÕ›²ÚÐ U6³HR€;º ¹™‡iN Œ¢še†A“AU6t.}Rú²#˜8»[k›f=ÿã‹ïÃs`3õ|ê\-7]qs×b»¶:â¶Þ~„·JÍzMˆuJ¥–{·=‘®mK,ªJñO橲™×Åh\ÑZ¥E«SÑWg̃l°‡š\?Kb]Vuמ<fb=ø4òÔJ6ÿI^ãzµPr;ÍŒYÁÄ/§X%7ÚÏPH×ñ¦q_+s ŬNÿH)ª®Py<4µ;‹ZÛq܇ç@'êy•ÈZGsê$åHÊPžºÄк‹æΪ€Î¾/‚|w$ãmÃÀ£ªä3<Sk1õ%Lˆ²è0¾N-$¨}G’éâÉtš<8-ehR¨†Nð|j¢°’ùýX÷zxÈSN¶1š¹Äkf= Xj.“ž‹ždG£l{¶qÊÒM=ÚÞ¥ãû8ç·M¦:Í.Ž‹»%E¾oÉ|[šXXëÊã¼3v¦ÀæéyÕçZYpjÁ q¶zFçzT/Wy]ÊÒâJdz.uÛj|·P²N€ªÂ‹œ€FZ(©*v>äØý8Œ^1â[ÙÒ314C—H¡3¶—³§+šåË##Z*Y`
²FÂÔ¿b¢&ÌPN0ç8Žó†2R¯»§NN~jÕ|7=Y6*;j-¬l‘Tú´³D¶KÔÓ¯[Èí£ÝrÓÅÒ0ö¼ê€0êËÁ
ÞUæ47”JMýf²ïÔaz +UœBRë2PmCñPë
õ‡MŒÄÑI¥Xò/Ü„¥Y^ž~€egUñ(Z·KŽSMêôéa%ôþÞ¼* +Õqk7×HOÓIC@c«º‘Ú\Ò tÃÄŒÝ$öl‹<¬MŒÙ–À¡£+-ËUá‘£F/bÝ¡ð°)r¸øy Aõº#õ¸ªa|©3
šZ-™¿&Bª–b'BŠ:yóhþA¶C¡–9§2 Š‚s¦2j¨CCýÔ»C¿¨óƒ–•&IhZD`2Uûä +œgf`¶Ýœ‹ÐÊØÀ«}Á’£«GJcšQüQš•·ªiÁƒ·-euT¢P僅Íoô¼Jtmv?Æ\s³>[TÆ÷Êð[´ÿqbÕîd³iAG΄Â`§´žÍ‡žë¿E½~í¢^ôGÑÚµÊ^s ή›ôOah.‘þ¢µ¹ha4û³Ú
ë/#N?0ÒRqÜb 2ë/ö
ãÒŒ)l}|õ¿‘B`ì-›æ‘…ÀH²Mÿ©ÕÀ*QøêgA« jû–q6S{µí3›û¥¡ãàdšCÃfu®n]W–M‡ñhÜmCneèÁdñ¥yT#ÖqªkñÐ14 +R 14$gÿšÒ”ÒIkQSŒ´tŠ:ìb²^¨ÄÁ‚^
uƒSÕL´ûS@=†?d„½ð|×®RØW]OÑ¢+ +ûUæ-ƒMÝÃp¢i«CüÎLý”„ƒÛXÛsŸõ€4ñ”ÑÍӲǢFë}Ð’XÀ«ÓÞvÌ‘ŒòÝh;‰gGC`#å;“ˆ/ì%E ȿŸ!¨LÀ‘ÈÚµµ=iRDOc êöw£ù!`ØŠk²xV6.‚&Èí,Ê +bÌd<`¿ýªc.õµ¸ ¯ìLÑ»+KÑ:ß*é|Œ,Òƒ2³e 6.wm 5(ì={ÈÂQV‹ÕÆ@¶ÊÃ…#Áè³´tæê6ö:K~°åÐúÍÕ´Žj²Nn}r2whFμÈYŽ¾$HeÐ:"Qžªúô±3Øš¼·ßÚ±¨m´ðNCÞ£9•ùä/!ì‹1 CÔÂ…èx@ê{vjYìæ1¢/Ý.Ûzâ¶ÖKƒþÇ›[ï:fÃÀ)Së³ri<]è¡»ÆTa'ÒÙ¨3V¿dVU-¡tܵ(×Íd2ˆ}8-šâDˆüŒ8Ác–md™½²QhH8¥ñfð7MŠÐ¾ŒŠ‘R3ä¢í‘w囊ÓÚ˜†¸KqJ.6½60Ï U6™$ƒ¢fa£‰Çª ¼2aˆFêcfßµRrÊÑø…ÕÒá+±6‚SÉÀ‚MÑ-‰…š‘_ù|ÆÌmXëÇÄÆØ~Õ1›È÷%IÃA_c @çF»JViÈZg4-% ]ÚU.îyì‰MÊÀb‡N*qÍ¿E!TKT¥”lçÆ–Ïš£À$yFô
e*-|xŽÆoÍêvËMiþ1kGLOw8´bS` +Üé/#´˜ò&(cïR&D +PƒgSx¶–‡ÂéD‰%„™ƒðèôŠÊ¤6fpš3]¼Å’ž²áŽ¶ÅtGØâZjAB¬h€§ÏC€$V•ŠÎQK´”(á*u–ÌkHH
êä¶=ïG¶ 2/eSÇdYKð¨ŽÍL%`“5v›0 ¢)˜¨pƒ‰*kiÑfõõeÁX‡ù˜€së]ÇlüÏÈ4áyJ¥12“ÄtF7×™®´*zºTðXnÙ“–òeÓÄnöãb”Àë@ÁtUѪwj¡ÔÖÕ0©Fèˆ +5-Ý3èÕ1$G‡•N!;èFôxÇÁY¢–*ãˆÍÛ9?¿]Ãœ øz6Šµ4°ë³2…iÁ1+ûfÓ7é˜óhýM`2=†~;¥˜LaÁýØHÈÉdI«#5Ù{)›Ý‰ÛZY õ së]Çld¶T$z§U¤eW3¯@–Û%ÃG3“vèDkpvv54l‚ÉØV²ž,¾TXÕBsà,핲òÆaÀC
õÒ VÇ¢8¦$zÜ»aŒ$"µAéI½®Ðþ(ÿ +J°ô˜®™õ¨ÈWúh¹kA+à¢*ë Gkt_I³Èd¬Æ‘}‚ITy¢‹@׸oh‰~‡jÑë Å¢™4K5»tkÒVkÎjKÇ—;ïj“1ZK”¨«1e¹uzäà“dÝQÆkÖ5GÒ6,Y®~ÈÌh‹`ôF߯ÑÎÖL-RçS‚>tßÉîYÈóåB3¯hkòªFZ +üêÎë‘ê.3[Šjt®Dõ4—Á<Nž-µ=šoG¥¢ý +ÊßPP<ÅMa%•4`  +éþ¤h +Žq9ÐÇÌm˜•<:èÜ~W›Î*[œ€sÚýµ) 5l¥°Í2ŸÖgµMª“ðؘÌÀx,Qì Z¹å +SyUj“¥ÕÄ´‚/.s Z>S +é¸tŒlË9®HƒSÄ>š=³êwAY¢t6$y¾¨ø,]å-j”²6ýYÙ2£âp!A›m
g|]ϘèC>UvbôFш^›¢ý3¦,ͧ‰…*AæÖåI²£Ùèmm‚ÛÄm-X>F§úö»ÚlÌZ†™)hÝ4õ¬Ä¬•ÃSg|h¦ÜÇ)Céî\cÓk@Ú°‰,BºN¬ÚSÀYŠˆgH +Öowfʬ¹XhôãËV»?"DZ‹ðKM)ÀÄØÙrœÙ¥¥h²r¨6ÿ€*‚ˆ=A°@æ5ºÕµª'«nÂ@w +NÖu@³Šá@‚KÇœcØèL
yÌ‘ØdÿSÃ&’¸3¢»Á¯°éµjîîÄmWéõx꽫ÍÆ(("s‘‘•
£’C³Ì
KÍw¬½s MJßg*ZLpt>ª«eǪM*ÍHƒ
5ø0à´ç«ñ%¢³VÙFYÔË„£³xU-PLvF3¡ˆÊŸöó) ©Èƒ+Æ‚!2@Šaˆ6%i¯‘ΚYy—ùƒkŽÓƒ#úlê7É2hVP˜º”µyˆ5+ÙgÔ€gÚŽ:#`ši¡gê²7ËoKͯIq¶êK-jŽxl‘g/ªé!Ür¥gömŒã‡4ssVwhngXB4 ¥G5«Yˆ•},ÓÅÄÀ°_ŒÉ +Þ°È%p•´ÛoKÝ¥-¹ÄU7,•¨Ç`†×¥Y +\Kê*°û¨¦TÕÂj1¤Ù‘~QšRÙCµbÞÅZ$J¶À5zvVÊ=³Þ`‹ýÁJlö
Ïc6ÛÁi"D¢×„rí`Àa^£Fq@jðʾƒ²@ǪÙü&¡¤•¶}@I‹Zˆ’ÆJRg(O~×â ³«\œ\–ši«›ö6"xrJvBYýÎÑPÒGH|’0¼*àÄ\,‰ƒˆ\l4naçÁEârTÖ‹‹8Ї@.ˆh]k—Äh=+ +¢1ˆé¡ðšÖ²€–†°7¶èoˆò`Á*S ëÃSÍ‚Ìd »É +’»ê¬‚¬k²°ÂPz4³]jÿ'~Ô*Vr†©µœ%• Ö2CPàZ**C™³ìö— î½&6¯§ÏÊtÔ˜ØOD^P?À©ýf\([m–â¬ù£Å˜¸((H÷`Ql6ÓhW‹¶™Å•JÔét}ÂkЬ[«*
äÃ*îÀ‘¼‡€†º‰‰\ìè”ÐI!?b>ì•t毶&£fvA·»Ìp,#Qˆ½Fä†C
+ÆRÏz¨Ðuá4†zò¬ðÞž>µ®«3‘QÀÚÓÑfíØK;Ò“Ü7»®ËXA[ᢵ®›(x±5‡4d24ÃÐÃœ(?qåhq¢@±¡ÂþIÜ,o0)wµò¡W;ONVÖüH=é#w¬€ª“°)ZYcÑ$y0dó¨7Å¡*&HÌÖ†-E-ïœ~X`2ûì`O‡:‡Z¡>êu}Ò,Ów úL¤¿SLÈP÷tÖ4eŠÁ¶a$1Àˆ+º6‹V€Òœ?dëÉÜb@S¢ÀŽƒ@€œ¬&×A!ñÔj=24€GT¶½# úÞé¢ñ"%hÖŠj48ÙvÉÚé…®Âé;ºŒ’Õêºd´ ä!åvVv +Ä@…ç 0Ø·‘Ͳͮƒp‰£û(æˆÄ&vóÆOð(n, ë%`CRj¬Zél5rðᤥ”‘k…¶×¸–U0žh‰+tŽC} +Õ&›‡ÓhÄóå™V['ôrÈ¿ðÄ2“QÅì41hRÍÅYI±ÿË›kãn’‚cR¾¯iZ±1›~èáž“£e«_›#`Ý!»/Èà;sC¢¾qÎþ¡üSz™”~mºRdº%¦™ÓŽ3D§=;+PLÔ¬4»tcãI£
l=úÁ¯e¯C9[#‹G󒢉ÎÃFMr“ÕMàõ©¤«
8j©²+ÿ[ï×®¿åÒ*ï©3Š +÷tF‘@€X ¶=ÆbFåårœÛvIÍêRˆ}3/gùZÄ”ô’%Èr¹>Ëo¤‚Þéa>>¢„žù?°€Þ/«—6ïÐK÷"Õ‚¯:j;l竪4ƒ(uÄì-˜½Wçç€ Ü·GFÑkFuÌú°®Ï8¼Ÿªç³ªð¼h¿5Ðô®QK¶ìØ6heuuOÙ,à!wiHkhɼ„lýüý`Oëøí0.AȤœ<82ë‘s@}n…¤ŸAß®n\"N7$¶³'ß`+‰lþæŽ9¹¢|1´Z†ñÁ#† ‚¡KÈÕCkleò¼‚æý§ÍÙ½)¦†b»¼£„ÔQ"Šõ³êgÅÓ®Ý麒ÞÜ
bt7ëÒ"Õ]£ µY¢ªcçNVªæ‘“EO+Xÿpä|·§)MôrgûÛ¬f—µ{•ž›ëa§XËÞò¢X´jcù¦:I´q¤´Îk íZ[Ý&éc¿ +Cµž&qq>ïÎ;=ª`ÞQï>†Ðš†ï3¬iÄ'{Z"½/CÓ=˜g¥è²5?ç÷–‘nµÀÇMJØ~fû]>‚\JWWô1ãËÈüžeh<˸Í|ÚÝ7:ÿ¸·¶™Ñh;³|hÒáÇ9´ž‡—|ç÷Ž‚Î!tùÝ >ŒÑC(>„Šz#©;ˆ5Å¢ P›_í'ËÇ)ƒÁ[—DÆÿÂéxÃéÒêÍ“ö–7ŠžGa|²&MÔÆólÂ5aÏwMü@áWv G09Tû«'!Ï¥õË‚Âeõ–!ƺ×Ú¡p÷Áže1že1že1že1¶'b罘™9{a¿³&Dzö(›1}¶$ 5]>–3TƒÖ—1Ž° +A›~•¼†k´öKՈǺ
Yuê›>@ýs‰pÚÚ#^-Ø¿5ëÓ9mq]´Ü7ßjˆPê€XcFjÑlU~? ^ˆyjù ×tëA"wöºƒ´°!"žD¡6¡Væ‚ÑÔdAö°^sÍZƒÞ(³ \öZ-ƒu.ÊÈŸÕƉÀ‘Š¾®2ą́UW˜SaÁug†™ô뢵ՑN<x²–l|J(y S¨<§¤lƒÔº³¹óÖ63£Ö¦HE:)™Ì0ÊjLmmM‹ú,áudîlMFquk†žÓ÷ºýHùÈY+;p0ÌÈ;?jÒYW÷b5ò¹ÅºbÞ*ÎߊS
ñ‰ŠÓÊHyrv@0/ÀõA÷I27)øå½ÚTFÊØ£u׬Mkû[vn1osGèE÷¼W:ºc§mÂ4F=g‚µðaœû^lá<a«sÆ®M»“¸³~¾¯¯9.¨Ý~k›™QÛ1&[C`Á9ö'¢6èŸHÕ°Ü™ªõw +~ߦV—T·…Ã(v¸ZŠœÝ1ÔhvÞÚff +Ì L•±®à½ò…œ–šŸ¯y45¬ÊÿÚ!ô„´¦€æ›)±Áûn»`¨µ^L2…*ê³gÉŽ•¼Y{|Q{õRölê5aGTÉOe…Ÿ‚92ž¡†P±öÆÎWtÓxYÕŠž¸·QDu1ãI`ýT2¿1RãP:È--“‰Ïn‚Òð;Ó´½@Ú1þ¸Árçmff%?:qâY€Úi%?’×”ÙÏ:V¤R´™k¿eÄÇÑ9t¯¤B†u3Ô¬7’,«”·0mZsûheŒ›6tOÊ]£bP4.ÀòUfñš.š†áœƒÔ7SF³ÏCcÖ.p¹Z5à)8M¤Ð¬‹ÌÚf•ãõ¡X—QÛA;sX:ˆõBº Î’‡a^ôÐÃ#”ϧŖin³¹³¤¾;øn¿µĮ́§–+¹–1 +ª +ÑÞÕ
™PeÝÈtÄÐI¸È»ðeŠÞ°
†Ó#ç-5ãc5N°øZ>2Z¯%ÈeÖÐÉÖÒXákxd6Á—M i+hpnÁ\_Ú +ŒÂ ±Èë[2ä´òôíøom:>¼uÅöÑ,)-<ÂïÝY¢‘î¸ZF-ârÜÀ»óÖ63£äZ©ZûU0è0/ ¬±kAVºÕlP=k/]æ]ƒV¿ØöA63Ãç`'c·#Òšl™u¡Oœò<Ë”¸ºª8ɳKZRäìšyÓL.j‰ÑME͸àƉÜ{67¼f–W-BÀK(Üsö"5_…µ|mrsëÜÆÆȺÍ"²ÕÏ¡²áµ®µZê£iêîdn/£Öé8nàÝyk›™Q]W`‡ÄàÌU—¼ö's•ážI\J +Õ6¼ÃæúòV›“BÓÈ¢iÎ[¹^?·‡?F¨=ôÖœ—Q¯(y’œ“|»c—3RÕ„˜5#Ê·B²Â×Ya; ]ÓDT4¢‡Šm‹ù†ád‡?(*p‰`Óq›i†j¾'åR0
Í¡„6Žþ«#Hh!¯$ÏÖ‘—:DÑ(CAûƒáìµ”CÍcó¸j%?¼YZöHÈšƒŸ^š:\ÏÚÿƒ1>u
³0m×(ŠÖæG¹yæ3ÑqÖÌ,ëƒ"ÐloÍåöÖ#Vù?·[ïl³2J2ñE¬š£ {_a›š£7lróÓìzDüÙë mêm‰Å$(nU½
#ÌI94 <Mhf˜ð%U̦Q. "Zm$gÕ€×ÑjM²¥NF¦dÑê`ÌÁ˜Ó Î AîóCzuŸ6皆|ŠäbjNÖbòm¸üÜЫæ™0×°‰@vVÝÂtö`Þ@èÅÞt×ÌîDA‚¦á‹U„ÌÂil)sh ¶—¾„µþqLð¾ýÒ6/³>R"ãB Òh«‰ +1†’ýÌIÓ ™å#¢²N=ôc#FŸÍ
!k:2x_!˜·rñGiÓ=Àn
´J”bú¦M£Ðv\`›z–@¤JÆ!Š×T;ÀÙâÂÔSgH2¬!¶‚K^Þ®É-M]Š1öa÷8Ç”Ë: ]•oJdX~K+ë–µCÓÊ-DQ +ü†!æ]Ú†±`«Ù*£ìƒ·TN-óâ]QˆÅض˜JäRIxýˆYãÇL-ª¶–`.¥.ãȹ<٥ŠOfÅÄd*”9’v4¦˜Kšù0Us?i2ïn1p±H6U¸š¸ZIz"Zô9Œs¬iv2m—D¦@£^¢àª*œÚˆMÁùoÅÕ1¸egd-ÄÃþ2ºÆu\ ñÿNææÝZUÃI£ V£ÏÚ˺d5”}”ƒŸ‘ÌŠ³ÂïV$“-x_0›¾ãꕤ2ŸÉYó×i±Ú~œ Tè’³~£†að´Çé3C}ÅñsÓÂø\@[)k™Ìµ…Ó»u!¥¦¨ø`êÞ`ƒ +Q·3T 4~´¶³tǪïbj“·‘áÖH]`EtŽh̃Lòdc#‡i²1ØÚøÐ,<'clA‚KZgÅ'ƒÊ4|^µCQ…¹gºMLð¸×˜†?0êˆQ¿³‡2Œ®¹çw&¨5¡$£A‡ß¦¬ðóå,ÿ?„yÕ`ñoM€ÁºiŸœ¶µ‘"Ct+T[أؿM%ø +ÙÆFÓo;Ù~´Æ¢\!¿xÓ"¦.4Šê4zì_ËixÌÖ>ZŠŠ×Ecw¢fdÙzƒ_Ë|}¤1´¼b=l¿â¢nælmeu#•´,7\adŒºAÐØy¤ÿÖ2ú•kªE‹%Óý©lÓ—}€Š•÷
+©2?þÐWÑÌ»j˜á#ÁP¯pz/ù—WÍ/Á,·Qì¹~#…`á9QxQ×ÈPýX×hS+Ï¡¸ä¯Ö[Ï“Ò6µ;ÖU;éÍà8<–5âtuýÙ£ÆPLRή±n˜¬ÉÇI1–iÓmÉåEõȺsUÚýXHY}e£gì2†J¨5ÛÓk?¼âFe0=þ–ln
—=Œ"ʯ®‚¾J¥²Ü]K’VO@Œ`c:¢\©ïlŽ'Í£§³T¶Á4‹núœÑ¬·=zlµBó³Gí—qõX¤¥vÐÕs{'Î^É×/Þ½yõÆO·îŸ>¿Ÿ»õÕí»ÙÐr“žrôÉûBWÞd^ýbïä{7¾½ñ•àÿ꣤ËÇï\½våÂæµÍríëÙîº\-ÚÓgå¿ÿ{«´¶AíB•æY^Ò¥ä5Kž}ÞVIe³–x™wDøÛòÃ72ôïì™Í?>s››øÚ÷÷²DŒ¯E¿SD1D»@‹1¢¶~–MϦȨÇUÊ~¶p¿^"àhš4nC•Ó)kV¿HRÿN‰ªºêEìJÛµÝ2oÄtIŒÀ¤˜ß5/Áã&4oÃG6ÚÍÖ{=¢öјn1ÍÎ*f^ÈGŠŸY• ¨,~šÇ1Ôª™jc kéO´ô'vÞBYXØæ-=Gøúç÷–=L ˜w‰»|“
ȧ*˜²,Ãf×´lÓ:o3GÆ7Íù0ó.ãywßéüãÞÛæ棽#ìˆEí;s4Ágcç÷Ž +Ϥ½Ó|Ê¢´D{;ørb¤4–mU&ÂW¯ªÁiÀ—“Ï£eN4¢5,¹Ž11~õëœÒ`=zyÑC‡T Ð-ŒƒºêY/ò}I‚–,çìj!ø®Ô/LS +~~ezƒo]Û jxÍ[Éô»8ÝZ„ŽÐ@:¼½z‘uðL"ëàDÖÁ3‰¬Ç¿ø˜‹åuº›áíh
c3%7&tͳç +ˆP¾lŸò T^T<® #Ö‘WŠfî3¤Á.]xgÝ9€µù:=²x÷¢™|M[:`Äy‹û‚KRu§ÍJ¬ÊMÄHÖF±«ÝÈ¢ë9ªhZ·¶±(„Á¨ÇN`ñò‡&h= >„ cÎ +\Ú†%J²JÒÍèLVß
åULújˆ¶û +ûëàÉÑAÈôª•éQ^fžê nÜ¡0*Pß1¦É +„GHÒb8,ÿÊf!AZ7
Ñ›WY¢ÁŒ tÁô 9`Ût8 p:…
¬7I{Û:vo¾oïËš|8¦è¨—ß id&ÇœWí€Ó Ê´CÑJŽä4ñ;˜ÏÄXÚ"çY>ƒÉ#|8(,ƒÐVÌìó\f‡aí/êéÀS¢sh¶œ£ªºÔ(/Ë“Ô€ +¨•Q]d©.ņèÄkÍA4ì +b(€c*AK‰ÅjþËV¢òÄHÓ ÏæÙavmŒ¥äFœ]LÜÊ1gêënq zŸ χãµqC Ú[XT¶†Gë㦎1 ½šýF7ü›U™ÖÁEX01cÁ@úQ
žq\‚2@/Ž)zY¦ÔÏzð£3ƒd,~9œéb´œª³Š³©J!kña WÛ›¢i1²494™9é<‚z´^«~½ÊèÓ¹³Q“Ž‚w_ܦÇ\|`òBK´}`Õ³bS2RsFµ¦¥QüÒî{}_JÃ0òð0ù® vNG¬¸,Òš‚_3›@bkj +À%((Ô»B§ Þ`8:¬ËQƒÄ0Ãøû,vGñƒiPÁ]è„?‹]ÒäDb'K7®·dºÑ¢¶²¯–ÚO
Ã÷/îå1†;êj +4©91³X8I,³fÖì@{YZ +pøKwt"C+³ >A¹3]DÎaÅ(m¸ˆó€`ø"@0½I)`dº'G¢\Œˆ|ë?ímhõSôâ^¾¸—LJ¶aCãq%k®}Kð˜ëÝ(mÍËʯ”Ký†27†A¡€QP‹Ý ¡:Ūù +麷5PU2‘!µÆª§¾j¬ +0{äj$£ò ©ª¡˜å=¤ïÉ,Œº<›"#>ìeâGn!ÈèËOgÇï¬O/ñ`œÍ0HZ6Ñ’ÏM뜦þÏê)ÙlE€»â¬¨#L8묊ªf +‚koÓõ°¿’ås!&–²¿G“µ»~¢Š +UæÝ6°ªÅÅÞÝÍ<Ç’°Lö»>Y ‘€É@u9ea*´ŽI}X•lfD@Ýœ}Œ[Pœ—U¸ªLoAƒ$t*XiO~(ùdÚƒ)4Áªp¶ÂÝ`5L=ô“šy)î±ÚPåùaL*5sçm<fPG·kÒ÷ïòJ…ÿPëgCºJdNu™Zøã³g™:ïÔÕاUœØxÕñ+r¯ Lʈ +ÍÀˆ‚U¨ŸQz¶q&²\^pïý!!7`–¼ï‡Š;ôM'ÌTQZlMЊÎņ6)˜6c÷oU:OÊúÀg•2–âÒT®qðY …öǾ2]~†IúÚkýÞZ -d^RC6WsŸªj@êÇb±W/R¢4•Ž·Ô'³oFh(óLMóÓµ2Ô~ -
PS<íbÕ¶"}äZ»—ò1¬ÖÞ…„ô}‘Y¥˜NHhTv 4.¥©©ì”C³Dà +-Z…ö›®@VØTf$šNGª‹àtÓ†QO°»X®g±ÿTrbª$Åç“j;MºD!ë¶HºÚ&©®Dmm¥!à–þT_*'rêÏSÙIl0ŸSOšX‹øO¥acïdÕð:y½ÀTOê8„ò€{ˆâ.TW%&!ʵÌEEÕ© Ð!ƒ%©¨_®DAyµÕ€šøi˜FÆÙÈRT¢T¤R>oÖBò³0gÒ€²†¼Q"EÙ™p‘[GðÄ"©Vu ”¬ -ÀHEc«®ÀIÑÞaŠÊEŒúh/Êg!µB=±d?Õ·+œj”‰¦ŸŠ³Ly«’yY.'š’R3±ˆùH6@µ -4
xº¬€Å¬ÎN«âXT3"”½ -ÈÔ¬HñÄŽD8`‘+Ä1}A…cÀ6º˜G8UKúFκ+ÄHÌÐâŒxÛrµ+ˆ§&˜²ÛŠè
õ)vN> ú,Æ‹²S5ì„…g|ªFÐQ¡^ØqÄh$|>‹4…dz®#tÊs”œ^’þµW®À5’$VÁ˜&QvGkÜ -©p|?ót5H‡¤e®HÙÎ%ÚRäº}äßd»SŽêjIÔ¢*·Ô)‡Çé4¬É5Ä8¼õdTw9•Ìú*n©j(G¶Ÿ¬¿ßdÕÖ(÷Û· Ëé*lºPmX9´ªQ¾kšEæÑåBÖ#ÎÁt¢’Ë)ôªÔm¼Wõ Ø£uVýáöìíÛEeŒwûÕÇØÔuElXlá4ç«ðQ#EÑ‹+‹ˆ-iñ’bOnµû&&9¹Õ[ÃA-B¶¦Ë×5;8Š€«nR$^C”<GWLÌÐ(PnŠbþ$6Æœ/9¹Dz)Hg¿o&ÊìOlU…}4b(Õle*8‘¹L
…u$1ù‚ÓÁÍlÝ÷œ-ñSŠDyßÑr`Û>è’àáÉaìGäZÒG4h©i‡¦VDžÆ&†Î› -G:pšnËe4º‡%,Âë(R
—bu+Ñ)‚xæ¯ÏZ˜—$±vgR“XÔcùN̤0CV|ñˆ;)ÏÁRãT-ÄRƒ?¼V<åðFW¦Â ãˆXåžÕhMiä°`ñ(ä$à'xñ¸‡^ `‡¼.M#}½hôò~“bÚy’ã$. ?ÉFnˆ®÷!Sbš‰šê#%¨ùÍ‘KT#]¼ýïbËŠXÍ‘EDò©DÁÖ8…”*¸ÉfO^W„Ü» -ÖCµ!÷‹HudáüT7éUÌG'ɺ8rðŠg‚q2Š4Ð!Â…K—p‘& ºw²”bæMîÍFJ°©Ž“Æ•£–.'[”v¡_¦Œâà4¬ÇxßÚ>‹Ù‚ë°Yu/¨ø”Êv|ZÛ*€EŽ#Y´÷® ò¡O’<ˆiؼ4/TÙ -KD-Žé2Âá„‹KW|PåÄ1‹Ì”¯/æB‡B›<…I,Aʤ~òªÙ(<—IäÉF>rýg´Ú8my½É;é. °T-Ùr‹~ùìõzöö¼øÏ*8Åöᢟ}MGÒ›‚“ãÅfKÎ(*,E¹H†‚g
'@ÑúÞ>‰¨(µ¯h²OX#îå¬ ÌVn˜Qb,Êÿ?{oº$Çqf‰Þà;¤Ùµ#mº@÷ðX¦M?HPìÑ4(âÒ´4mc²B¡HV«XUZžþÆY>Ȫ T¢Rœ…ôÊôôððå[Îwθ¥GfÂ^Žbm5Õ—©Þd–§OÚL.|¦§¡Qt"€T_@µ²…´’4ŽT¢0*о"»è[Ñ?“wºH2fCˆ¦Yu1~2Î0‡Ÿ8Ó‰fó“²61bxâ××^š‰1!r&åêÎ $c„]*7æ*b`¦êCt^ù$QJ7÷$áÅøC«S¤ÕÖ2ÑL“†äqêö_èr–™ˆ²+AµAÌt¡¶üÙ&/#`Ó{%î8îù©®5 -Š3ʬÌ÷‘PX¢ ì]"T†ø‹Ç®Ùƨ
„>GA³h΢oƒG®7–˜Ð•ªà¬q3µ×Ì£A¦3PóÝZ=Gñ…ÉàM—×AtS4ªÆŒé½Œª¨®Ÿ£¶bÖZ3ê -ø®®"4kÅG1éJg!:öŽ|Ë^ó4®¹ÒþO¢®ªhè÷‘P$[“âdeˆx*9¬¡3Áê§ãž‚0b×)ï§ihÌ!%Ô߀Ië2 -mvq™£„bY|E7³#1"[báIÜDLipÜzî€0£n6ŽîÁxh¨ñ'&£ôËõ`Bð¨Aäå=tY«d"ØÍUÉûD@W5àæûÄú}Î0€.Ü,“›¼?CŠ[ý‘ɦÐØ‹xZü6"×ÄŽbCĶe…âAFߪÝúÙXÀΰ
5.wC\ -hTy -yì´ÝP³}‰Ønøl -35ÂÔØϱ[™Œ:ÝzØñ£ÇjšiÖ¹êD)dýP[0•ŸCuTŠÂUÂuLÛ«òJø7‚
ô„Ën’²&›
‰D£e3Qï¡ 3
æ8óÔ QaÚÒ¯’µ×ƒGWdÍ0Õì¸TbO=9&aì“ôMaiù0îAÕ3i@ÚÈǶ!#Ó<GP²AÑH2Ù…¦KflS9VÃä{ŠVääOÓNf"¤Ô£(š—#8š'J¹Ye’hË|<#ãH2§Npz` 4ºI‹\6«¹O‡,³MÙP?qs×ËÊ–†¬ÛÄ…Â_áјU[z»ªwu¢¨Šã\³=3ï$²'69ç)®˜î,±Y)oNd¯ѵyd‡åï"SõŽÇâ÷`cîÜè¨ßC'sÏê1ayYhçÌKÐÉ¡QÊÍØç$ôls0nž¥mœ7Z妣q²ÍÂÓcì|&”Ñbš4d
—€ésó+É$ ïÇa¾Ç΃Ͼs -à”[EIi.0~vdœkž
ÁžDa@ê–•ã±›gÙ¨…8ÿ¬N]¿‡OJ×–ÀÛý!‰9îÁ°©t FWŽãì#JƒžbÛ¡e–À’6n\9Uæ Ý’7=~A*g³¦´Ã/Wï¥N‚ž<æ$~ æ¹5š¬Y0¬`³ü¾Õ]cbÆX²f&a£q=´$Ì -äú.Z:·ÄÁ‡F0$ó±·,£Ù'AÀÕX}¢'Uð¡r¶‰Ì -ûòX¶\M’ñçº;Ñ<Mu½c{v‹æöký¦ä«—LÊ2@Æ‘)ÈTÝ0søÛd-”]jjßØ©zT”&IrÑ8ŽEj™÷0¬–ÛºF$‡°¼cßYÉ‚:oÐë;°Mf‹ïF yøæ$í5Ön²NÁèÕ6½¦ø¬.s4º¢Ÿ\6dôÚ®PV˜$1·mD_¯Ò©†qIÛU›oŒï7ÚvÔ¢«¬óÂ’$Y×rüh’GzbžœûÎœaýƶèS”AÑð#Moï0ï~ðJèëðd݃R±ÅÚ®ëŠHŠÚféP<‰fÞïhf¹ykVi
–zŠ•X[Å=‰(§p1l”ÛbòÌ@¢0xA׫ÍÚO?ÚPƒ›&û–\‰Aô!±I«-lKÔÿ¦lnBõ‰_P²Ÿ»ÚUê"äDÞàܨVâzÅB{³ í¾Ø©¨l¡?6‡8ÊÎÒÔ™k…Ôkê oI®N~tˆÊ„³Eô‡ª³n -fÆÜ<è\°½8Kw=‘¡·IçR(†¢¦ØH¹¶àE‘ æ<D¸¦ÅÆ›z(huĈùwV¹-ˆŽL‹Lqf‘MFú€-T3÷Ž|ç¾´@
Œ¾¨Ž¤™!ÈÉtÿ#|Ó1´‰_ce``L=::Víª3(£|OŠŠ?~rª-6U}2ªƒà÷7¯£`Œ%~nålº–£Y¯x:V-·Á©Laí¶¥0í}}œAe”®¯¶?% Ñ(n’VÀ1j¹Ô«›mñ¢>¬Dm¶g‰Z2Õä€xnê‚ó„—™Žk -àÑ%K‰vT)u…}Šã•ãìXåhîœ ³™ƒ¦Gk̤výV
«ƒë.Ü`„«¨/sÔ&"ʪ`0óA—Í®+Þ<fõCžmÙ›¶_¢¡ö[S“1ˆ HLR ‡*8¤ûä]Rò(ÇYõX|‹c\8HŽZˆ{X. ->—Epa²4ùc@É¢ì$ß©Q9m>~r¦ÑB„ÛKû×Z¢—’îIž*® -SÞ0ìˆdçb3ÎQBú×Íâ¢C~ºY/hž³ÓÖcl¶Ò¼C+ -ñÕ<‹@Å‚.v†¹sd†}Ãmi°áàŸºHÄ6Æ|4w5Æ/T¹ó^>à“•OÝ4DÏ\G¯£:ÉK`³–Î b— -ŠðadiÆÕ«D©gÖ¯`}ÑdošJ\œ™7 ¿]ã6„¥`êÇŽñöª=mW£_¨@À 0‹Òìþš,®R_×ÉYrs,¨VA^B§wÍ°²Äz0·3y—òë‚ë„@ƒ)»,ÔF£; Ú¦{1BÌÄÄÕ¸¸/NCöm›ÐÆ™üY¼ÿ˜iŠx•F|w-oÍ$¹h¦9›ÁËñ$šÅ¶1ƒ·umÌ ìIW³‚4ZÁ-ÍRÄãD¢ï‰ç¬6—¯ïœÈéaS»åwÐlõ9˜ä¦ší„¹RZLrÐ6EÚTsLÈ Ô±Òhƒj‰(ŠP27Š> ³a®x ›.˜ïjº¤¸}SŽMƽ8¢Æû#ÂcÝWóÈÒ"%/h;ÇúXåHSˆV,iæG’¢Ô¨òÉ&Eêo04¡]&hr1”‚¥öñzâØ4ËM4÷òF—f–\ªyVDÕXÊÞ¢âÐÖ#íÿ:)Óã%mO…€2˱<>"ãI.9Ðu -éÒ¬‚ÈÉ2v0{ÎÁí`r‹5ä†áÈdï©¿bs§}9´ÍZYâì`‡åê2|ÉÚú~‘`•ýg“õ¢0]¨‹>Ög?‰Ü…×?Õ~ùýÞlŒ|‘e0¿x‰EÂBCc`°zÝ®ê øËÇ9>ká\2!CÜGµ3²JaØUëxI–!¶`tuCá;„¡^É.èïÎ>6("×èØ{f®ªEáØŒ©a Š÷\/м»IÚU+ÅÜfÕ;×ÔÞ••@—-Æ3ಖSÄX§&ý^Î¥a ´Ö‚±t”#;© -.¸>'¯&þ2ÇÊ‚!:¸foPrS îðˆ0šç -ú~ŒªÓÒìÚ)5
ƒÄŽ£ýÄŠ 6š/=°0Á©õU:Ó阫´šZ†Õì1F©â5,öG$5s¼š$&í¾Û¬Â‘åT£V·-i|–7Ê)åR_ZyjeÇ;@®XVwo¯#VyÙhEü,=LP)ö1‚Òv"\§Y²@±Y.¬³ß¨Ð›ÍÆ)èjˆYㅈϢ³°Ï߇™’SãÍçêk•Íò`„½&CZ«Âûˆ,FÂQC@)X…rõß´!DVœB´w‰+Šâ*\Ý|ã"ï°.*nÆ)iàJ -–‹.?’ª+ž@ŒŠñ1±xÄ( ÿ>GBÉ<FàpA9æeVNŽlE^08¬ã™´*žõ¹—À)mnÃ9ÐXk5(whšæ0Œßää¶îBÈKï0´ßÿ¥Ñ«èCÙÑ5%‡Ð¸JØj2ዽf9çúþH8ï%BÁÒJ‘Õà6ý fU -p -MM½éMz¦-¡Ð²Àö*XŽ, -2÷ظl¾¦2 =ãØxH)æE7„·’HldJ§¥HX!QÏ~AZ‹‚^€'çÈ/Éi¨wd߸ -u;XÚˆAïÉ©vRÃ[Ÿ†ÙæôIa¸ˆÒ@1>û£éÇØÊÆÙka€E$c§k@ØWgÀµ£÷ %QSñÌ¢HEí ÌM"bSœQc ÃѬ4˜T&€#ñ¹ ‘ÝÞ¿&ánv·A9Y3ŽÐšRE „ßý2[Íš—,–Õ#)93ã$J]~$ä¥/·H7Á>¹ùfÈæ–ÝœEÍLyp±Iâß&Ï 7E*³,·˜êÀ9šD² -4š©Ð—»YmÙÒÛAvÆJƒÎÈ d4ªA#“nlôzã'‹?ɤž:è„¿ -¢4¹F„Æœ/ôÁTVŠVä®'£þë}l,ë]².Lç¨h?SúI‹¦£EuUñPÂí¢jû”9öåWC<@¹ˆÇ’'ˆWq‰
Æð¡94Jº -k
Œ8¯Áû+q†¡Y¥ Îë]"64Òj懛K4ÁAb2 •.д@#ºÎ7ÐràI5nž$8ûmƒ(âHT#|ÜhUÊÍÝ´¶Š¾÷BêO<=£Ð;w‚Í’ÏÐåÚšÍ
´kW»U‹‘™¡Å~1íñ6éØ»®Ál—›‚Õd7оƻì7I+V¶æò¤ÄE=4‰Q^šF`åC—Ëž>¡Šˆ¦ê,ÅVJc -ÎÔZ1Âß¹,º¢4—X¬4Ë\LMš.òrŽ0›!ŠÚ¹ñ\ÎáhZŽh›>ömgRÍóèêÉ$q -:Šb?‚©Û›"®Ä9×;ªïg)]èPUí"ã4IyQ`"5&ÇÀ¤6eWÈàÆ™ÐÅŸ:N+K&ÅšÃýŸVž2Q‚jÍZ¶Kj0µøH\¾I<QñýΤ IûõI4ëðBóàÎfÖ0±y4x•á*2K‰ÊÒ\Y±ÖN;[£8½Y•8ÑÌ—ƒVœîOÜ:úûLQE£ý-àaà›kƒÕ3yEÊt†]ä ÕÜ4ç‘4“Ëm9ÄB:&yœPékDbSŸœ’…CDpEôuÔ,àr«Œu”£&FÁÌdWYW]~YBÇÔrëðÐÇágÍV5M_¹·´x"’39‼xÞÆ!\=‡Ð&$a÷k²šƒ‘‹½Ù6¸KüX<6k9uxRq¯µºµHO·5CäüÓ°öa÷ŘRâB£ààÎYaƒò•>g»¡nNž1*÷`{G¯qet‚ķ桹‹s¿¶&÷Ì÷Ц‡ë6î"a)Äf<±5À{pjruÔ'Q̹”àÎíÊìO’u±½á¹w(šæ¶Í²9‹7K½RÝÁY»pã:AQ ëÒÙóÉŸŠËçS -ÙŽÐ!¨Ú S3¸”'cPµA„º÷Áè4ãÜ*ŸX¨šG,H„à$¶Ac#{E[“fÐcŒRÜ‘šFö‘+«^vMî¥.Äuz¸º¹g|¢q`„YZ:ý6Ü}⎂e Rd4¥ÝU×ó«¨99ý2ÞG•³eA›T>”‰ -J#¶ä\-eBÂɪRFAð>ËW¥Q®Ü€Ð¼±0u -"ÆóûH2¥hx$ÇqêP‹Ëéã'qÝ+#Q»Þâвà°MÄ‘Žlh~×Ê觰”¥..¶ìäæ`#K‘˜àûê©Mù/û+n¸p‰ê2³)¾_ã*©Dy“mCº|jœÛŽf1t#yØ÷ÞL¬ák&%6„_²Ø à¡“ëC,¹ašÝÆ$¯f¶ÔˆÍÙTˆCL“«3a+-C,„Ó»"¡àLNRjpˆ¨/%UªÙê²@á‘kéçÍNu](Ïð¦ÑÁšTgN[YW&§@¾+‡;•u¡âQ——ê”ÈŒ¡ÔF•‚smëìó’: -áàJ,Ä,?±s®x®‘m+@f±#½ -çdš]ázýC>/4e—KÙt!¤DHK–G…š)¤ehH(£èkr–ln‹£XÅÏ*ËWÚ˜g:á?“@ãƒ*I…É™ÌÙM% € -Ræ0÷J¸½#Üi³\ÔS‡ÉîkCh!]f·!MUë~ˆò’›À±A¦©å¨|CJÚ>aMp²k_V©.Ûì]jrÊ’Ñ–CÇ/ÑÚS³ý)}RÎ4ç°&muý“1žíE¤£ÊáñU,A<N¬,u##ÒËXÐ.j’:Q‰ÔwJÎ+Fè
¾Åñɺ‡zÃQ@5v.qdîˆ -I†Î€†¤sl¾c¶µ´:Þ -øÃ’G¯¤ÆgûÔ;TW⬆ÍjBZ_iî™Å82z?ɨ„< œ†[ÌeÕ³öµ÷Òçlø,dU"§)N#xº’ -„š]q‹êa(|icy\RPVåRxЧqíÀK”ïVàë¨Ô&b™9z0Fe‡©´•“ëÙ£d.ço„Ï€.*”£ëmkTÙˆà=ìn˜¹ô{¡°eä
‚KDõ_ÍîHø‰ÁÅ}¬WÑz¡¶n>zBV¥¨%UÜÇeØEÚ½DlÍÁ.eg©‘ÙA¥ç)àÚ.Ä×—wàFMíúÑfNÆÌð4è'S(‡£ä·%K~7÷¨*Ô“åæmG -k+¹‹").)ƒ^l׺Â:ë¢æ¥êrÐÝç
1¡È}º„‹hž:‘£ËÛh‰„¡ÈªQc–’í–šàüR{J30•Z̬YZç<«ÒÒj”V&“á¯K96™84×RýYép±Wahîà1y£’ù¾ÿo~òâêùéî“ëÛ//Ÿß~»ûôúÕÍ·»_]]D~ÄåUüæéÿ”úei,§XZþ7¥òyÚÿ_§¿¤Å:Y6ñχå`/Kþ³e7ôüÓ -8E9èûÀ¡t)}dªÃ²HÑBaÐyã™ -’ç9ʯp¢ -kƒžÃÑú¯’ùª%âýN=‘¹.§Pð¢fÜý%É ‰Ž2ø…n;/8n`q6Åw÷Ñ9…EªÂaþ®¹á°ku+ ‹íÁÜØã>_væ‘RXÌ.â9©Ìƒ‹’ïÏYg§°Ì{ÅX6Ù(e’ŽÂlÕNqñÇÛG²‹uÁg˱“êa‘´™µ™Ì^,,ŠmoóTd+tÞOð.Ü–ê…ž¸J@SúÞ+’’BäÍ"Ø|±C²2PRå’³•cO²`Iµê§?<cOö<õWNïZ -¡flÜ'öXhÆÚhós Y·¼¶ÑgO7VÂŽÁ0GÞ–qÞarY©À”!t€×žCC÷m• ÇD¬VRÞòžC]2mk @F -š€BÖb&F>7Fƹðüƒ]÷)Í€¤Ãòμ»y¯vz4Vn° =Àš84ÄC˜øUÅ·.Yðß—‡V™ÁC]|¶úÅšÞ¸m‡jĬ¼°l#Õ+à TéE3h¢<
Þ–ˆ{pIàøhxW©u": ® -"`ÄgD«²D¼ih„™¬0²]à”tíà ïUŒBÎ$F”{ˆÍšâê\³rá;QiB\ªa×®‰¸+˜ -ä'…(Óh†çO‚Œ -2㔎±«B‹õ!ÝÍLq/] Nxò -Å‚Xřݦõô>—Ɔw¡=à‚)„+×ÜNfÒóÇxöë@:¿ F݇Ç"þß‚Êðß -ñŽE±k„¢3‰¸ñTM]NTUH^`¤'ö H8±üþ¬Ë@âp- ÀiV ø|€É9_lÀqt3S:ÑŸ°C£©«Ž¥`¹ca d ÒA'×ú)ÃæxÛøY“pF>Pò0kR¦!@Øâäìż˜I\„y8½ --x½W|ªWçÁu¤!ÆÔgÍ@LŸ¥'Â×âŠx;ã è
œØIPyÖ@‰Òä»^ë…'žŽ¨žìõXçv¡±)6ÓžõGzÁBU"'‡˜Ã
X²ö±G ÞPöëÑB#ig}¶AõgCKç̵¦°£à.öé#¡YÀøÕË×Â|Ri¨„ƒŽ–`Q~WP‘’¢°µy^z¬Jœcô""Yš§6ýHvèá¡)h—•·CéÝi—çÖAÑ -&¬[ç(è¾Hƒ\Pfnš5IZaT)‹é3òxÊ”ÁšÛ[@ïÞgu½F -TGZsm•¤íÇ«·¤uißÙ(Ð ß7«–ØÁy¡ÑénîÝ:>t󴽡†ž‡nví_„¿ - "1‰íǬ¼¸4¦¶8{mФì×,é±æ‚ó–¹ïÞ´Æ‘5˜æ½â$ˆt¡".\^3Ðù}ûÖA‰Z -XÂpDG5ƒx®vÃE
õ¾l›#µK%@4Úï~öA'±ö/ÿòrìÁ„;O-"½¶íúF¥ÉØÎ(bìµnãþVñãÞgqŠëìßôº6j -ÇñÖD¸¸×œj‰˜dž°{Ib¡Æ:éDpc$s%´÷ÙѼ{½n9‚x²µÙ´ ›Nû†‡Ü Pýþ`÷>»>ÖÚ鈩)–ªã”MµE£uPG›Œ²žl´VC¨ôÁZc\7©“}»ùìâr³Žc¯×µQˆï¯q[¬}6íï«üðv¬›ÏnŸ5:½ûü1/}\£ÙB11öA‘šÝŽ«‘ÚdhòA(4q
dlßb^DǓΧhÐ2ÍhlæEY<¨\†Ÿje\Òƒª4ºáƒaÌ-ä-[6w+šY‘¡÷oÍB¿3˜šAw©5.íGkuçŸ~rròêâ««["ï6`¹w¿ -0št›Qã":ù8±éÙ94¬·“[A*2„£¬QÃ_Ú=’773«£?Ö&GrÚäUB™Íaèã·ªÖrm†k«É-»eåFßm¹xòW|±Þö“n~¤÷ò®²ð…®fv$;5ªÍFs`ÊŽ›tدsE¶Ÿ¾-æ/¥ÕqGxÏk[Ê@©Wß®„SÂô¨j_ðÃ#gjëÜ,A”E4„¤ óO²*wùÁ)ø±¶;·Y—å3Æü®›Úì©ôeËèMMV’˜ô9×ÌìÜ«MHºL±qºö‚òßß8ì€>[núéú1]Z9ȃ4¬äF+ñ27Àp¬íîÍÁ{t.%\Óèí6MF«ÕÅqœµ·G‰÷hoÖ#/»e¬:S•ïuÐ5ci -žQet\‰Ô’7Z6–A‘Y†ðˆ×!8íiÈöyÒÆ?vñ}Û_)Ü4_BwýÇ:•džK;§!žÂŸzÌqïÑ×
[Z´^5å»ÑØ"k¤~ãûÛ©Ò¯ü`1“Õ®rÝø¾8x*8¨h”ma+“«ø `’½}þT1r©1SÞ?Õɧ¾?ïÏ™?LVÚà š—‹{Í,ÛRcí»{·5Žsí7ƒIý\î|Ì_ñÙÖ붑#ˆÖæ)lµµ×ÒÜÒ͚Ǿ?ڽϮÏÕz½7aF¦øÁ
T§v"¬Í›MíŠC‚Z1&7Æv¶k¼ýl6¹ø^ŸÛFþ~¤ÐÝœÓöDXn$T÷Gq$p¬ÛO¶gÚöyïù11IîîW°ÊA‹ AÔHÛfÈh"ÀÎP;#íÈã˜MêîvºUÜp9“‹‘½Ñ®~ÊKpŸy2è\]_{”'~ì~Ç”õ‰ ŽàRš±AA¢E8ˆ‘§©D¬T¢‰ŒÖÎCd¥rÎbÁV)úâ³LO«×*˦¬AüÔLË -aš)‚mÈv<ŒK~Ô9$0uj)•©…y<‡G1ß“|cÑ`|ƒ?§ •Dr)ÍÕnYÇ øŠ›{¤”c`—+…õxùÕ0¡W¿2»9»ýäÛi‚î2^PcƉ ƒC¦ÃHÛ`ŽÛ1R{c´—óÅôÚ‘3ÚJ{”`…%Ñù^ -ߨë"Έy„·Æhƒ5)á®Õ÷kí,tìÆS‚hè$Î)?ºv©É÷íbÇ[`…ùÎÛT‹T'ɼ¶í`.‡Ylû¶KÈtÊm -Žsâ´•)‡1*F$ŠAÂÂAÑ£Õ
-‹^qà„wh¨šÏU˜Ð©¡"Æ@M2ä/K1vfðâ -zR9 -î-]*\à>¦)?ª°ðˆX?Ó“aëý¾¬ŠaÖ)2p80€vÄZOp˜C¹–Éw©¬H•‹ÈS¿¡Y:,Xv]³V)²=ª’κY6Z—ô¶Äó0Æâ:\LLûhdU©tMˈXÌŽî@꤄z§ &,*j‰÷ï"…ÍOM®eH8¹N%í/ÊÅñ Þ©®˜ØÀ•YÔ |G¦>·ªþ&Lv/*%QOîì>ò"£áà -¶%Õ䵃G¢Ÿ“U£‚¡PXr4Á¦ -¥[À»YoC²÷¹¶ýGY2W¸¼¢.!tLS -Z±õ„VÇ>î³1 -3A–žs0Ê–>j0M¨-¯cÛ´ÈÙúƒ÷&-N£@ÁÎ’2ê7@õ¤’sñÄÅ>“â•ÚD}Ôü Æ#Q@ùëV÷éB9¦!œ‰Ð³ì%®óxusTkÒ›@£M™îE -Iô9JÖIÇ9ëÆ™›;‹8D$ -ÔÛ[Z–[†iž˜ggIÿéŸöq -‘ -FÑPãdNȪç¢À™œ8“÷")¯ -øq"È-27FVÿŽ©‰ų́·GâD¬À£C:êÌl1Z‹áˆ°^æ5H2R ì;jCKÜÝB&àÞ´’¦óÂ2ÃI½q\½Hôî\rTOå‹caç8£H{ -‚uV›œD‚v^¶,,©ä– ZDð-÷Û¥~‘M¸Ò¬¨#Hê©HZ„k¢gèVòVÞøþÁÙz"£ÓGäcq½|ÃÑ€ˆ— ?ƒ“àsNNQ!· -ž—<ÏvJ"OˆµªìFDT½à»à‡¡‘µYoŠ£YF½7ó(êŽ4‡ÞË>:ßkÚËUÙ1 ¨H5ÂÑG/+„®‰v@§8RìDØÃf‡^ÄÙ3…ã:87‡P0ú§•ŠB[üÎòi÷dfõVï{!æt`©EbB -tNgœ„o<| eÐد$QAL%N:"HM”Ç*5Zt°†ß]koÃÁ”¡‚°ïnÄ#åçƒîÏ‚LÈ+Ô6éjmˆð/ƒrƒHI™Gå´jÅ1MÈ£dµ4ÒP–a Ì&]tÐM˜¬‹U‡äfu®V„2Ö埲 nmâÁdP<ûl‰ãþQ4¼±½«ïDLí›E'ðžAˆ+ƒç«îUÅ›… «Yf̺ð’À±SrÜôaÞ°ãÜ+á)®KF$¨’T`\i…›OÄEŸVó("Rø0¢²AvÇT
—Å0˜Ç¯ó)†»µk³™âê¦ìQ¿Fï°øó6k&ð2Ý&ðC²„j±r¢ÃË 6Ø„T¨§¹ÂJ¥Ú’;“h@ÌýºÌ’ àö*`3m¹ù™L‰#ÉgzÍIUl‹¾1J™ƒ¸HJ0ÍG¯×b(UÝ'œ¥ÉBa=%ÓC©¶<sŒ2<ªèLûÁaO6AV¸évC~™Bÿ²úå03¡CÚrê[L~Ž#”ñ{û!lÖYõšGÕ ’ígƒ9ݦN!4Ýq’tÍÑHD˘Ê!ùPßTºnîÍÛ<ê®Ó
—%–&GX²öÔò™³s!¦ -ò7¬x:™w°Œgâ¹ k[#c\‰,ÎTÀAwág.fíOMHX(úNÜ1a çc¥óÒ; I뛪&mt‹ªºæ§º?eûÁûÍÂqàÀðŠzF'(Ea•1Dï«#ÝPmSLIùʹZÚmDehýÏ#·¥Ü5¼ðQ·f{bÆ»DÑ5néËR¸S×›r<TÓËÀ…îb°M…}sw¯1ºåYéË (7'‡2Zü -15z§‰†ðšfj€7¸I¥±)σ,ß¡eEH±'†+›¼ÀÓ[áàë…C_ÏNjÖy.Së/;|®Cðµ§ÕåÁpÍZ¿‡R8¤cZȘ̩¢ DE¿†EÒdŽaê‡UmZ/4›š±E§Pž#îz8LÁÎëÉ»jñžSä“&« ð›ÁòÚ¢ïˆâöÑ9ý*´ý¬yc¿°!¿l6>JDîd¯e<l>5ígJ*ŸÖÐHßIsN(Ô9‡üJ‘X-`g.9ÌA„Nx¯×£ê`r›Šfu‘[±w*š‘\èJj+Ç“ÆÁ:¾„¬ô¯ê -Ðrô\šæS'!YGÙØK¬œ<²@ &“õ`‰ç}³K*P-.‘°‚R-û–jÂ!>§>Z¹™Ò˜"<CªR ›’lMZÙÅÒd´—û8ða:v-/e¢%Xžs¸àq½Þð!€¶Aý¤q4‡¥óTl --)gj
HãhQivÄ×L‹<×Þ##5×t -Ñ9.¤]š)#â -vÍÔ]cŒ…³[{¶7Æ0[2ioñlÿ䣧ùµÊüMc¤m#@2íµ?œ‰Ì¥ÑS -W‚tÀzvr%§±l/ú»èû’‰SŠ1Ç}¿!gC¦‡*Шöwd·ÁÃð}¾ª»‰žúÁk&å‚©ßÜQŒ"ê…ˆÚy;M%b*Q#…Š2a9ÃFÌ"#œ¹·B»øh‹«¾ûÌ
¹%gñÌ*ùïÈökºYr%î<+_°*.‚w(-RÙû,ÆÆ‹½p3ïGfYƒ0)´*¹ÄÜ¢ƒXé€× -ÅeMQì!T>¥DÍØÛ‘0Ì{X;X8C .pdm5| -уAÁèýx6SmCäcPFa…&ˆrÝû‚¯óbφL´Êب›Zc`ðh2mJp^º¼ÿø¬5}´±HŠ’t‰u2´ôsDj˜ÜÐg‰¨ïåËâÊ‹]³¬–WÚ3…µÙEI“ÂÇ5ì7b©%ê¡*L§×4Þ‹‚0uŒ°Àä³–€¯§ªêæe‚…¾ôHœz.9ÐËC ¹fÊ -_‰›P¹.BdÅþ†8%ïx|ˆ¥H¶µÅ^dÄ@cHBd(ºb¶5Q£‰o?'Û(|\J¸õ-蜨"ˤñDëÚl&ôy…S?6)ê,l#¤ž€À™¶8ÿ¶`z#Õi³9…A…lå5Òzõ£´Du8×r™D§2D¤‘f׸æÐcØͯ•: Cã`éíºzRj¶•î±Ô½VB¥†PYP²ÅAÚirÖ2,;ÂÑì'Èn+w/‰›Ùm®ñ¶¾ZVêP£¤E–ÕYõʼ[•ÂQYaQhéÑz™º -z±á³Q3Û‡þIªá ·âŘòf†QÏ!,x’Âdèý¬ÚEe -a -ц’#Á¥@2Œ,™¤™G¼VZ”+ËmºÓ4·î¸±¥GdåEù”ù·åRúj˜V›Dg¡ñÙ1,vGNœ«ûjÆßÁñ®vx`?"©Ð=*váy
Ç@cq°·xßo$&0‹]ä¤húðS-&²ù¾ÓÇä‘Á€*ÅEän={hÕ,ó² %¿š©b§-Gz«”&ÚÜõ¯Q€´ÅùV©ŠÆqÔ
•äÕD&Ž%½*?0,—¼Ã{Ïc̘ËùÃæŠYŸƒ‹a áÄЖ’ØL"&˜6”¼o•ãËI -lOarÝ#ý핾¹€¡ßëUÖ‡´:ój1²dÆ=¦&ÞFÝê#‡Yà:2l -ƒAÔ\6˜³s÷Œï -¨Ò‘Ñ0°`w‘¥êk«}i$óx½“ITJðJœ0ð"c‡ÈN.ÄãuË7LöE1á™\ÒÐQìÉÔ‘¤0ˆ±‘¸3ÊVj!ÚÜ ªÃàÏ’²^ÓXIÍ&(e¸¬SS|ᚦÓÔÀ(ØunâWÆ¡úW¹Fröž
%9 -1”ï[lrZNÅ—Âf¬Ÿè ¼§!ÄAgUm}¦1â°›Ç*ƒ{¡¤Z„D‰ -3Œíg²ñ„³4ÀQ»;6äI%s -ë‡Å}ŠëQ´ø(¨TÀËBòΘ‹.Ö/âªUXN …ßàHˆÚ†€¦2•Ýöz¥å+\+Z™#ªÜèi@dí15räÖa°Ž¬†ÄtÄ'æ<nI) -B΂ԮýoP`
dŠ³„îŽFF -û^/48ìÀ!UzjZ22X•Š×zèf.«d ªmÞ™¤>Äù‰>5!ñj:é\¹¨ÀŽQƒà‰ŠL,PüÖzÐ]¥ÄNÊŠo)`"®º5ŸÞ3s«˜\©…Õ=EXÚ@nPµZÚ/nZã<+²@µê¡ØM
ìì™3’‡$æ¢ȱâaŒ(8•é7UàFÄ¡´f¬Áéo6'˜µÖÊ÷ËáÑX›}m—/&ÓK-›ø„×I±üŒ‰^ë¤V´^±}á'è»àÍN³ I)ã)²¶26pÉ<bÛ¯t¢OƒïÖÈpztVJïKèY@‚§S GÈ Ëx5ÜéÒRHï+Þ›jœ¡X×½j†ðYËhZ_JŸ}_VŵjB47 [Td2·¤ó -ÍYFY¡š•¥ÆÉ(—‡’á›Û´¸Áú38 -È%äù pªAaÉô3IŸ»¯~‰..t +ž)ÂÒqEy8›Ö*tjTMºZÕ8ûµÂÅ:X+*ëHo¸ž¡Ðì ¬:X¥ã¬¤dx -ç5©\ï‹5gyÔ,& ’˱X™Ycdûy¾€qh¸ÙäL6š§6ºI^îG„SÙù•Z›KלÆ2P*¡Sq´^X0oPEan#«\"[´‘@"ŸqÊ0)oè®Îy8E¥ï½ùœ×Dd|Zaº›!÷R7Ô¤!,3ëAìô &öÒ’õêÙg¥&auÄôžS\0Ï%ÒŒ*šaRcY!Bsð&ìó¥|چ׌”ý¨wS@qà3åÇíéd [Ý <ñ¼öƒ -û;`\àP•9f¬âheÛ%Þˆžf¬ˆ$`DrdðÀŠxº²î—#Ñ™p"‰õVÊ Êd¶½Y#5²9ý ¬ƒFÖ©ÈïÅH{HÄ”UÓ{ÓœØ+>5¶ -ž¾<rº Ûæ²æ«e•OüÄU„#48&Aò8€
$^ÀfÎÁ’W¦°Ü7 ïÛhÀÜÌ@6-n¦¨„)¶L}€6×°¦Ý¬b -Æ)gJpñŒ&Ja*³°Ò“jOî@B×
g:¤Û £8$Úð}ѳêᘜV£oÄëûiµÐˆH2£¬zÐuõÂÅñöÞØ>›!Có‹¸u6… -/ã½w¿vjLJëýF.ƒÛxx¬™>ô´µR,ï7hBÞxµ¼õ„ÌúËòâžÝþéüôæƒÿíòê—üÅ°ùð“K.>þå2úÝ?ðñ'‹ÑóÝiüõãÇW/±o??;_æŸ_ßÙåNPëGõÇþÈ??ô¥g·Ç'¿Û/½Á/}z|sv²ý™ë«ßŸ~ïW2ÿýüËkvédkè-quûÕé ÁüQó|ìÞTaÑ&åÇŸ~½û—Ý»7Ý Jô/;þêî_>Ø}üôøúögùôüôòÅ÷?ý÷œßÛq¯^¿þšñ~ÏÐ_]¾xuvûšao¿øc¼t¼Îw˜'|}¦/? -ü×Z^Çïüäpû|8ÿ!ÇŽêÀ¡ûž,™œê -I™æÔͺ_g~vùNü@§»ß~üÅoÿm÷Õé&ÉESOÇ0«Ñíúßžž#_ágqÚ;´·¼ÇE Øöí½>=½Œ/ÇÙnèkŠ/Ç=0ËØm_~ü§ãøîó1ûÙøÍÖ/{ÄßGÂk)ÚÔºøôüUÌÒEÒ¦ÉS¦~ñU=zûêÇßœ^ÞûÛ]¨AͶg–c&
¸Ñö^£ðgCKáñÏûü‹Ÿ-¿ðÛŸ-cþ·Ÿë»Œ·>qŠößeüÿ
.¼ô”ÐÑŒŽÆ¥£Ô:ãw·ÅxË}ä±»ÙÕ°×U
4sÜÈøW¼ftUÇ6:®éµ«šÐÕ´×UÑ$¬‚[è*Þ§µ®ãµ«eþögÓæ%ìÌr7ö5G÷mÊ4ê©.=qLeÓQ^
Ž¶úWó´%¶÷&ª›£§ÍÓ=ªÞÔkÔc³”–•×µ…9rOó¦§1VåöÙr„óÚÞÉÚîêiìê)væÊQgIJMOÛw˜µVÔã„5º|ç·?ëRZúœ£ÏE‹¥Ê»M¦6›{„M5Å —¾¿øY沯K%Ç·@æ Îùêìî¶çÝlÊŸƒw¬Û‰‹i`û~}½ ‹ãÐ]µ¸GŒ
«¿¶=ÆÚï6ºp]¼Ó!¶»—Ž{ÂKí°dÓöU8Jö¨¶]´=0úFßNùÇXòË>ÊwzšcL6̽Ð3ÞêÔÕŒ5»¼øåù¶]‰Ãž//fe=I}¨µ7Qôo‚ÄÇLx S–ëÝÛ-êá3·ÓŠññÙ¬_žˆÝÞžÒûÜžÓ뉧XÝnÎ~ŽqÛQñmµ\>¼‹Éú¥¸s†˜¸.&¸lÏìÒ·ç-8Šº.îƒèiE€>–Z»h¦ðtÚ…\¶og™®è»ÇþíÖ¡]à~ÛÓ-Öa¿]~)^tÞ.šì#i95'ŠÂ³Éçf"U‹°ÇåZ¶íˆÁm»ìcE·a´³%~¬Æ´×¸´{-x¿+Œu9&~‹EÞ®Áv’nþ%Ø$ûX®íÍ–þîÁZÑó€e‹»Æè†x)í…7MšV›“}¿l‚èûqÀ[°‹úÜ&7vqt]à -i§N;›†hé·×ç¸`ýe] -šŸß£v.þ›es{QLü÷o¾xòË«§þñ_vþñâürùóÑrn.³üêVÕg¬È[–ìI?Bÿ›O-¯ýüÅõ©‹˜Åÿsû§—§úë‡ÿíòæwß_ßü˦JkûÑïŽÒgÑ~óšÏéjÄ]|ðŸÿîgçòêòô
&¨„ýᙉOþóßö¹žŸ]¾XÚ½Á³-‹ãÙéí/ù?ü|ÛOÿH¯ÿg¢ûÞ™x£ç?;^ÎÞ7Yø?øVÿž6úÿøî·:>ú7^Ñx¼“W7·Wۓ쯷ÿÇÍ1²\¸ó–-ö¦Ëñ¯¾/ž¡Ðÿ½ÊOa—Þ|ý‡÷ø6þoƒ›ó³“¿÷³ø(ça¼öý¾Ñ»ý[¼GC~´ø??ô0z“‡ùÓßúaÊ0ÃÃ~èiþ tõ?цý·|ª<W:~衾5_Æ?Õ·YãoùX
xóºz~u»˜ON¿¾ýòúìjñýà£ÝÿÎ{põóÌ{võêúäôS€ýþæwÿrCý‡pqz{üb1…Þuó;Žãÿ}áØÛ¬®Í‡9}¨,þ¢ëv-ˆ±˜1¯^îž_~óêø›ÓÝÓ«—¯^êCÀ¨ù;óîøúöùÕñõ‹Ý ã»Ýî:|˶9ØõSÓ+í~uúÇÛÝÏ_œÝ??;7·ÖòÿñÅ鋳W»¯No®Î_7tW¸ò¡A~~Žhóåéµ~âv·z~wÏ‚Òª²_¿ð(´ñ‚¥Œ{¿yyu{çSÇçgÞu%2ïÅ˳Gj‹É\æâºÍø'¿Ø}òêöj÷ÕñÍíéõÙŸOït‰Y|yüry€›³‹WçR¥îµó|¯‹e^âÅîΖ<¾=Ý‘Çu<Kg+úûâôæÛ6$þæfê¿·ûß_^üþêÕíîÅòÛd¬ùêöåòïï>ožîöúøòæåñ²%Nþ´ô{öb™‹˜¨\qß/ÅÏÖÜçéõŸÍëêüÁO>oì°~ô{ÝŒu»?Òî붌OÎÏ^.Ÿ‡£õÇe¼ß,æ%7®£ØûÆ5çùè»Ó“ÛåGžŸ_žÜ_e{_YÞê°v·ËnÜ_»¶÷öÜÿ÷ê»t÷D4Jß7ð`PÛ]}wzýAÓ›ý7ýûO~ñ,n§ËhoþýÛ³“oŸ^_}}v~jRµM×{}úÙç -Ÿy¡»Ô¹©w?· âL}~ݧþîÞsMyW -R~n -ØbŸÑí™9’ó›ÃRn³“Ý©ÃL6pjÚî¿°ûÄö¼Õ¨¯@H,.òZ^nRËíõJ·<1{˜Ï&ÌÁ÷¶”ÏþéÞ¹¿_J/¹{òš êÙ³ùyõ³s¼u‚
ÑÔNhŸýÓ†¬%,Ùn|ž¬.Û±„ÌM©6§G¿¢àä/Ìh>ß.àoy×ï'(¿SrSÜŸ Nø„P°áˆÐ["6²n[!S‚
KD‹ î#z®mÐí$4´ÛÎwк•Ç?ÔöŒˆ™M9¿SvÉõt_,a}6,
5x®6(Üuh_®€É÷¤Ù‰•üLõ€ÎÔÉøt– .£Ç -¿¢Žº KÍ|Ìvô–LÎOGøµ ¿šS£ÈQ?ŒÁ¿;áXNNè+‹ôÌãÞ2ïÉä¢þ¯çËsX¦&
›’׸ÅYˆœ «¹oÏ8™J€Öº~j¢|m'òWç -ZЫëÃo*R·÷Ùþëi›7ÆØYÿワÌpmcL©é0•‰(aj‡q‚á^ÀºšpÙ
Ö¾6`KcºèæÓ§ê{ÌZ0cU™ÀLA3÷R¿˜ebÖcÖŸU³m+UÌ~öÎ1§ê¢Æœ×¦skB9ÌcR
0¯}xÂ|±¢ó“®hb,8‚š¶‹Dre,Ú -ÿ`±Ýˆ%K~«†XJsRcdåÃ2ø¡‡eË–7_ãXaŒ±RÔ¨Ç*O«Nâ+¬ž-º°¦ÓÄZ×_%ÖÙ›RØ×0¼Xz¦T7=lÔp›°I«VÇfƒ[Ì"l Kl±e°m {ÄöeK;NÛGìbrd”Xv|Uª‰¢R“Pi”ºe§©4&£6¥ùŒ”¶â8¨tÚ‹[®tÿrJ_I«S»ž2¢‡”±S÷¨L.ku%9È»”Ù~v£,ô2eeyVt)k›êNÙ¼´Ê®
ÀéÅ7Jå°Ž
•“-À¼fÊU -¸ñªíáöÒx‡{.q#*i"x¶¨ãéeu‰óa=^÷ZbxWyéàƒÍúˆÏ~Wüw8ªà‡Åt«Áfc—F»žU5Íö qy•AM bÿÖÄVqפ=¼¦ØYï4
)¬ùª¦'š±måÒüÌÝߚѶh®f}[«9·ÍZóÜÚѺZ}‹6X
ö´‰üޥ͖ë3m¥‰jÛ+ÝA;¸.‹Ú…§kÔnÙ¡ö²ŽEüÓF˜βðwt¿' ÿú.ºìèŠ@*껺F×맺YîPÐm6î’È+õÚÄ|ª·&½·Pˆè£ƒ³EŸ>g}Ųžé;¹d[?Úcyý*Ò -™÷ߦԙ\™ÊÓ³ÊÔíWœ¦éÈ™2m'ë¶Y¹k¬Íf<b4{æ¸9^:¶ÍùÍbon¹{Nó¨×.š×–ÚÒ|ýù²YŒ‰ï¢Å£™l,±å`±ä[º¶¥U©-ã|3cÙäv«2çY͵ÚÄꛩÜÖä53°–§õ«™XÁBt[•ÁĦÓÅC6gSµ¶EÝcÒ–»TT¶ÖѶMªN·mðÚñ¬® Àíö’Þj×õK{vl+Ú›{¯Ã>±'÷ö]¦ÒràÇUÜákŽÈ>µq䓃®£c°¤À&ó:Ž•Ö©'ê;§Ç¥9“îQÓYñ&rξ_sþ~|.e»lSà.ë%it…C^+×5*]ƒúâšwÕg×Ù©>»kÃÅío{•ît2‰»›Ö²Þ=5ÿØÜG“Áë1QÏ>ÊxÈ„µîiÔêCÏd£ÛxŽþ®Ækè¹<^¿~F‚ý,=Èw¼ˆcíöïy÷–b¹íe2_>™pù¾"Á’o•ýúUå˜Ãï˜ç+þ„¦uðWSË4W~÷…Lê[
H%dV4èΗ‡Àª&xPß샮dš„ölýBpÖÎiƒ—±²éTîP,ù» -U–ÓlhìëéCÇÅ×(lŽv“áˆa¦—ÆËixØRçÇœÛ1¥ó§H˜˜ô#¥¼!~ÁìG«ƒ&j6'×ÑHéÔ–…JtLšˆèé0öǬå´5÷:µ±ºÇb³íúÇýuÜ9þ^ÅS³îO¼ýÓ^ĵãeBZÿ&üÕë6‘?ØN‰A"JNS£OZJg2î(D’õË%—\LÒ-BݹÎo¹t&re‹…è·—qâ0*ÖSVMd•JøúT³‡ÅS+öKjÛ¿g2h]úÉÒ|Ý$'åË9ôá´Û줳úÀ’îãÓbúhÔŸ26>™!*§u¦³LE2[Ãæ'kjä#Ù¸^ÿ›m~O“Ù_ú”Ó_¥\d®2æêe?·lÍ#y]ùûœ
Zy`Œø¼\] -:ß©[ ^¨kã†Â²õý[ÔÛ±V1²J$‹æÊQüM±’Ñû³,Å=©ïRÛ*•¶¡Q¶É`™ØåoåÕT>¦ÖÚŠc9VU²ÑÞµ2¼.U¬¿¸V}ä^Y-ûu¸¯.Œ}MgØjQ篷ÖòY£µm©™«[çšf=mMꃲþÐÀ”=cÃ׈†•€®Üø¹,&Mô¥j&¾óæW=VmžÁuË=Û[Åe¤ØZhR¿m}¢îRàíøÏ¢ÙþòáÊöiIu<™þo§lÔ;?ëâ´k©½]¢ßœtûßß6^-¾ËBô«a -쿶)}áÛ¾8¾óΟÁ÷l0‰ôôá)ÖK⫯^orˆô±¾E£ÀûÁR`ÒoVë…þ¾±ñ\cjPƾƒ•×ÐZšÍÔ0«³{‡ÓÎÒ8Ò»²×Qrg_ß—éXôÆÑX«=þŠUêãk¶Rk•Ê¤5kU&'ä6õ•.->ŸíßÓ}>;žyL?¿³êÔvšm[ßú¹+gsÏ+á¯Ä|“ÖÎÌqº(·;×Åzsþ8ÎìO¹®þ -üèEÜÇvv¬<aNËü³ô[§¡Á›>ëñ…ÿÿÜÍUAGUý#PÜ-76ÀÏÛ8Œw·£#§ÝÅ -ð -,ËðŠcìwˆS"wn²yµsoÛi›VIë̯½Ö™MóÄÆ[ÙR#èðX2RµS&¿˜oDöÛ£Šx“û1Ôš}Uìp0 ˆÇ ‚Sòíi{ª;H§Hb÷˜é¥Ùšlö¾ªHXÇ!
‰¿N‹¾ (¨‰·M”YúlŒ!úS¨ÊSÍ“¦Ôˆæè:²`évlÆH$erÑŸ0
§g¿¥šÉ{‡¼rÂMc¹{úLìºp
6š»Ð37– †ˆÔÐRwy¾<¿Óxƒø5kþ˜µê„gÒ¬†2Ä0o,§—xE=-Æ'˜}`¿wUà7³¯Tg½ÞIDZÎ2¬`¾å”¹MXwO,ê©¢' ->™.éƒrâ÷ƒ®"Áìy¿H®Î+”–æïŠC¯Êf˜QçÍprM—WÑÎ}ånHz@Ž9Á[¼`H_†³m¼>ÊÖUXGR -1#Âo†WSNŽ
;gË0hˆE\;àì5’ê±%¹»9`)÷„÷–ž}ø~ÍÙiX¿6€M4½O™Ó0 bµ
»£6FÂ'zK{ñVÕ›4ˆ|>c&C)·½…cù1ì¨æbOlr6œ«o†?½¾èÊàŠµ&Vo%S¬Ù'ƒfÜ©ÁÔ)‡^=HÚÓÉB~Š€%nÛæ“@ÔnÒ%£÷g@ááþ†j‰žÁ¯ (“è‡è«§^pTáÛ0úõA>KP â!3éu›‰šcøuHÁ&! “asø€¸£JÀF%…âよÝ;¹ÿ"ˆšÀÞTP—PÀX -ôdºgM|>—ç'Zõ+x`ÛîYEÚv¶ vq³ 0¯·ÙŸç‰Eõ\·®*ß@mN“”¾ít(¿¥!QSH³!f…¡Qv'^&‰ßö0¹úõXƒ‹-þô[ƒÐ$2òzk³=윙Ñh5¶¾é3 ÀJ¦ýÿɲðîþ€ñcÖG)Ugdµ²6¹4v“ÖU$ çŠK'Ž-²ËÞB2†0cì9¨dùR§ -: -Ôš§'«#bF…&Bs†*™
°,ýŸ«ý³:ê_ÏóI0 ™‘
#~"Ýõ.€9žrØiW‘¶Šé{<#…Zc©ÚQ•X4i §I¡Ÿ¥(D–*Üü”à„4k1¾ò’ƒ¾AE¦vב÷o}ôì‡Ljë·Ï;-äÕJŒ¥»-Ñþµ‹Ç«¥z‹$ô³Ûf±ï56ïú:©Ø -ùɱ‘ù>Ç×ÌKrÙÃÆHz8¼¬¾Ì %ŸX@µ¯,ž
@OË ±v„1æÅÝ`̶ÜDJÚ_Œ·X|¸?™Ò”JlÖ=XªÆhk|¼!hxcÁ|W ÌÇ%Æ…]Ž×Ó³_0/á“#ÖÄühЄuWÇ.¹zäXty¾¢IöWPXc -Ü¿!÷±c¿·lܸ—
L&÷:ÙEiþµ9<q
1qÍëO¹—ÕȽ?`%“úÊ&Hî/‡1Òí!Ê°òY`,îM†KDO0/OîJXj33Š¹oQ
’Ü%i× X|æÃq¿"¬`ìFOíܺœFžgºsi"LKÐvØ
·yGb[Ž€]Œ£x”\‰òÕùH];§ŒÏ‚µc1ë.%ZuôÅíã*¸ÈL~bÉEIlÊv÷O8Ú±C¦®'ƒ`³önº¥MìôËÌßW˜Ê¤NxT— ->sùFQÉ ÷¶6…Øè¢êÔж닱Pà)Ó¾x»cñïÔ´²ÑóÔ%Ú3ùƒ¯@õ+½gk©ob
ýæÇ·t±“ÙWjÖ~`5ð-ÀŒ·
`^Xê
µ…`Å@Aé5Éapiå#uDŽ[0É?Œš3/à\]ã¾ÉáÇbÏ´Lô30Å@k¨fR·÷ëy¯ì“BÖÁ€¸ï¯°Ë%sb³µ-ÀzYy"r7<øíC£ÛÁy-½¾êÞ Ú5 Ìf“ãc“/3aóiÉäܳŽ7ˆ±=±ñ©|6‡é¸ŠÊÕ
š0–„yXEè|"<í|¦!ŠñZ#v|\ªsr.žc{¢žN:YJ¶¢wíÐCï/ÞÐjúMd§µJÂÕv\&~ ÂÀæa«’º\´àÏôÈÓ“h-ï æÕññ£ê»¼ƒ% Ô¡•…´>l1ßÃE÷Ò«ñ!\Ý¡ÔÄúuàjÞTÏ|
ºNUš:Ÿ±—ü^¦ÈùHÏô%5It -<P4:¿ã†ã,–hö¶@{©èeQ „ðíkOddTd2Þ*b,ÛrŒ05ÜwŸ!Õ[ÿ:žjĽþÚß5JlÁ 6Ñ&p#CSIoÞ™wõXaVtEm°¶³i@Ìkí%—pu•ÍL¸çÒÊ)æq è,=ˆe-ó#µgó'¶‡»aÅ>þuª€‰ðåg@ì>¬D껕K<ßµÏXHÃùÒŒ˜mý&ö™è™Hùòú‡‘¿”Þ–n§ÞO/(k,퉅?·!&†î/ŒN!2¾Ù)‘;”·^Àìã¼@)iíù|ÈJ©jŽjÝL¦ìˆ×”· më€äoX=a2Ixðƒ›ÈŽ7øƒüÙTô€6ý”¥"ŸU&´ä2PÈttɘí2s¾›˜Ád&lþÆï - -ÒÛ±ñéi?_ -ãÿÌOòîzÂô²”%U—ÈkÔº+çÖUº{ÙÝtså3¥&¼÷òµn&X™ÞRÓ'Tl)ˆÜ‰#ûZX)¼B’ž™i~ã-ýÇ;Ѳ@vxþŸ½˜åÖ…¼ °º]¡'%›xf)5ÄÚü§“öe2³
Å.}¸ý°qZm!Žö“¾îx={¿üáorUÞz\’$ ¨–þKjÔeE]¼R’¼Òˆ‘aènHµs!¾ûéÎÔ -Û¬š+èÝ~Á _ÿ]wëBÙ‚dzZdJ8ȳã˼±¼n'»ñj#u÷
g
ËR=XBuH®8°‹·ç“Öjþ¿r»ÂRSå(}¬yLQ“¨ª«›~ÌJðÊÜHÞ·cYF¥ÐàÀÞ¼9_,Óýuw¿F˜º0%»[ÿƒ¥!ÿqnæÃÞk]rëCBTÝHxÃèí
™ýD0Ìq¼ÆhkbµYEƒ1º¼8á'‡+T
8ï/ª÷OèEÐm\ÄŸ^gTµð˜Xغ‘û[‡1\ó,1½3ÆÌVmMcÆÈ:„éK_~Ì´\W£…3^uÌTì˜ÙVtجᮡwcI}Õuvœ‹ sÄÚ-"΄Ïéó|y¶_(A95˜·¶ÌpžTà§S$<‰›¥\,ï?G|™PÛBî¿\Ô©÷e#¾ÈnƒÇÃS»!îÝÑXœêª1i6Ô -ø -çÓ)xn -#M{î@v`D:P— - -œ‡–AêYåÓ¸0Ò¦;íøIiÅÞs)ƒT3hÏZSÑ,‚ԽԵݔ0R—¾g9~„Gª$.®j6¡±ÚÈD>&‚Ô£RïNú°ÒîÀF.Ju)Jž¼£Mc!=7l"Mg
Qò:¾"B -Öâ$ÅÓ6Xɽk¤ -œOà‹Ê¥‘vÍ:£%W˜&oª·&9H¿B¶‚×l‡H
<¤ -ü¬ÌÌ÷žÚØì -%¿ëÛl«õJ¡±ž•ù̼ôý¥× "miw?¢HëËêh‚*ðDZ~§mü!$Œ´àÄ›d,FzÈ)…™Ñ¶†iåE„Àße[;š'„‘#©á Úï"í—×Y„î/cýíºg¤ÒžÏÖ?oÌÂHK¿‡mÙïsò,í0kÞ‰ø„טÒnÓ–Zms‚H}%³‹õÍ@Ž´#Ÿi®CïF:qêyL£ÿ*Œ
©CÑe¸#-ØF†@"51Hˆ€ý=Þ„~øÄGzÞkÂ4ÒKÔÈ)Öë)¤‰®=Ë„¦Ó¹Á -œA‹,¤´s¾…‘ºº_¢HÁ&òkçécì±"KG)Üò¦bHgl¤®:°‘Yh}¥D…t¦Ñ¨¤Hû¿#uòȵÿûHÓR}Y¯l´‡¢H‘ö/‚؃@û0HÁX8cí‹">»Ä‘Bí_©‡úÿRx¬!Ì"…´ EŠt -)ä}Z¨S48³:÷ßУOôDè“_³œvƒëvÇæ}‘–Õqꔟ¶s/éuGK‹s/NKËÖé¶:5–ƒ&B^O´pÑÔc<Ž·®Tó'rÐÍ´±eeïGúÐáQ‡@Düõ/êEÄŸþ&€à§ f'#šhô‘Nÿ1÷4¤ßÜuKÐ0¸ðjÄó>±—°.ç~ÿSck̴Ϭ|oL@,iöpG¹(íS]nVÀ
Th¯†u(½Ç¬T4\Þ=n öœÇѸ Û\+I¨Sk–×)v—†W-XºE“Cµ±üh<w "9–ýk"ÿŒèðÝyʘŸŸgFˆþˆÎàmþêÊçó§ºÏ@¯1¡Båµ)A,ùó·G듲,dK˜Ýø%EA)ä,÷±‚æ—V³®8;2µ²Ò½ã딤;Pn¾è•ü6å‰/Nšî -qbqEþQôR\Ñã=ŠgK7Õ˞ؼw™C@
%z„i7€—ŒÜ,ÒSÊDý¡igß Ó®kÆDŶW"œàкÊׇÆÞÅÐàœÑV£øŒÔ鼆>Mìa䊽‹±F5¯X4ôì?ˆÑÀÒÚ¿4 ! Ö0ç:,ÚÞÙ½ÎGz
è\‡™&ÓÁ>Vk3¨”Ÿÿ„±‰ïÒ˽1|[9¬•Œœ:ÂÀìr BtgòùnLÊå;i®{åXÙ¹JÎ¥ÊnjÚMðÏ·‘uHñ°,€dÔ¥òBÓ (ÆžPøL(ãˆ~\`|w)ø¸6ÊÕ{—XýBc¹¤{IOÎbƒŒÙæ—¦õA{œÆâ+§d–~¦…É=kßY‹nL2tF¦1Ðf¾/¢Û’e~Ó&™×µ'!ÞŸ¥¹rZ€XÅ=³ñJté͉î•åÝ9*è’¸Bw›:.o•/©X<Óù93¸Ã%‹æ/]Ù2 ¨•ü°úNF¿ -ü•N©þ( -\b¥ƒµÃÝôþ" -ÊÝšd Üdò+p^ß÷îö¾ -\HàlB½”Í>:ÖQ\¦7ÞØ<¾qøìÝØÛþ²ÐÅÅLÍ, ø¼|bfÊÿš˜ÀZØKBV‹ŠÙ?F?p™¹…liŽ%þÌ/¨ILÂ<‡#Oµ…‚ü0 -ÂÄö¼–@uy)„ŠyÝm,æ4F7ƒ½í¯êšUÒCSÈLvãFB¾êD+Ìù»c*ÙMì؆k%=Kv·O¥XÒ2%Â1MŸ™!)^6'SX0n–ýñÄfâ8>Ë|”'³ÆäKF/âJ1³wâ¡|)Åå¾ef>·í±„βïúØ£ëì™ãpí;ðÜ$à·MÁ Ù?œX¥EÕ.Ñ,0–¦ÄÏ{ªvÉÎã»>‹!oò,ÿEÅqZ‰§¦‰'ÁH«Ò1ðÚðR%Ö©˜PŠ¦øü=—E0Ks=˜‚ó'7Ïwz–#µ¸ÑéØÇ2DOÌɇXfÊ+Àž¯xùã:XߤØÓ4Qùƒd$ÚŸ(Æuü:®™è”áÖdrÉÓe|¾fÖÕkÂ~Ké|9 -v¬3ÙÞϬ‡ÜÇb"(nL¤˜n)'&²µ—ùŒ÷Ïkç»j@H¼ŸŽà˜žÍ¾L8ròHD¡Pú‚óL®‡H‰øç
&׉;ÄãYµlD"žµGÃCijöød"xL(êíé´ÞaC&ùˆåUx—
0Éke„ä˜(vrÙPB‡ô~Í^\hŸ¹
Áy}Dò‘œ$BVy»ØS8âW‹Ü¦%fýx%ðÓÛи^iÞmzÓ£&ŸI_ìôÔ ¾g¤Ú•
aYìbá?e¤Ž•CI¤23RÇʉ—Á“T¿d¤öŽŸÉH…p>‘‘ -óÅÞÏH…P>‘‘ -áÈ»šgÅõ!¿4õå #½™ž}.vÞfC^*œ°ût*Šç—ŒèùD*œà¼|<îï~K.Ťm÷ìÊ7RáØw¡d¸ÿ“T8¯ÂÿA*œ°L¦}Ö•RÙ¢€}²TâÓR4VUÎð\},iybÉ
ô‚ ܲ<Š2ȘøÍv/ê0—¿z¸ÀÊFïÊ<‘ºˆr¡-Áò<¹™ŸW×½‡¿9ܼ£Ûÿ°jœI=¨Äe¤¼LoZã!¡š]S¤_H%³^´@ò“¨·‹Ê†_©S,žñ4rÉ„ešL&¬yX„ ~¸mGø†ÛeÚãÄÍÅÊ:ƒV£ô-žwæ«*ìåÅMvNËE¶ó™…Ô½4à!l/–açêv¤’ÝfVQ¤6²‘Ê°ÃË«âXéHiÚìg!åçbŒg–ŽŸìæê,÷Ê„¼0¥N*ÙÍná!åÖãnÅ2ì<*ÕÑsí‰%»}Kem¥3ìö†(RMa¾œ‰!K×ã«vÄ‘¦JßiQòªwÎàPi•›a‡f0,=jô‰^ç™í‚Bí(¯§¥«WÑ¥¯Píè³àPDK7+)B^7ü
UÊw,#ä–«ÁwÔX8gDÍþ3©=Ï#Tù^ñ:VG]b‹ItêYpê³8Êzýd%9¡²#wªÈð.IU’{É÷MÈ‘|’
‰î„|!®ïY9ɸ>ùëéI9Ññ Õ}{VlDîøž×MôguFxw©½Q?N>¿¤çâ…ˆDÃ]å “öôþ%›îo~˜W³é„ì€[-ÎÏeÓɼæÍl:!Ÿ Ÿ_ÞϦʥûkæ£x6/^8Òþl:Yhž¼ìl:!POnùC6Ýwä³é„Îiî{åDzé„réØöþg²é„rédÆö¼M'äk¿U`ÿ\6Ðì"OïG³é„”vìèg²é„réDn›#›î±KK•¸¦ô×l:!åT:›Nhþ¢¡Þ̦ãƒzZSøOÙtbºåg³éäSìl:(þ™ø‡²éþD±—³é$s¬>–M'œ[ýél:! -"YÏbâuI®(Q]Ž{0õ§.AŠN½TvYªK¢F‚Ne—ED&ÜŸQÔž;ó,"§ÚxRØ\Ú3w¯–%Uèîí2w¬{®dªä)s'Z]./+WIf™;±L.y‰t²$¤ã“™BwïÍUº{SeFÒK%«ÌÝS"$ÌÛeîhFºÐÝÛeî¨Ü·'…îäò¸çÊmÚ¥'Q~žEþc!J‡<£rÿ9—-¬—»>EOy`º§±‡ÏÖ'L£ƒÆ³¤^V"œˆfÅóCñ Ùù… -£5z+G˜±÷.QR6„Hù´Þ«TµáñHfâ=FPKZâb1Ôóóú#™)÷›_×$A®Ÿª`^TĈeó~ó¥BÕb§o°ðÚÛêE*ªó8¸%€‚ónµj -Ê …n8|-Vµ)#‘á¥^½Q€
[2dyàß®pw˯«q÷6®økÝê×*ÜIe>¾Á†·…FW¸ûH¥¼§ùDò*å½›Ot¯”÷>JT¸ãæ%ÉÉùK…;©z¯°ÆÝëîäÞj³ŸÞO¬í5GÌz•X€=Wsrª6Ýßkù™îwýG0¿°(˜ýÚ=WÎäæÃÎGò9‹6y¶ØS8â¹°¼$&ųk&P¹¼WòÛ…’˜Ø§¢P@˜Ø0 {22üZ·ºo2Ó˜ä$1iþ%ÊÚÅä¤1qùÄwÊ€ºÏ‹hS@'+C]Òl¿se@'‡+å$1iÃ;¾òýW»²óR“X¬(±Ó¾¦vèÞ7nåç)†—%vºT
ˆOä¸&-â·ŠAûåÕŠt/•{D¤×ǺŸ»šª‹Nß>”ãÚ½šêufr~©Üã“JyÖ?渲øó†!#ëùyŽ+è’ì¬g©WÚ'¢àÆwSý`Æ[&Ü Öödškªy®®À‰¨±ÞïGFø”® ì>²Ó#gmDIPrí²|Çô'N^)Zc#åäÃ)ð³ªÕ°]UÜ:läwW$N/ž„wºŽv®Læ¥áÙb¹•Ú[Ó÷Å’ðz¢HÁX”äÁ):V[ZõÕEªÍN,?buØôÒ{&CàŠÛÁBÊMM;k½¦Ž “—å¨×E¿7BH8$0¿æ'
oÌÏýc“7ªˆ õ¨pW‰1>X~FÜPiZíGš®ª¾„¢ºo¾'µ’´&UG0ßGšJ5INd@«†ïM÷OtæÕ¶rg_¤3imÇί´¸ˆÆÀþ’b¶I0残¯tÞkhowóLJø‰ïÌ°I@T·qª˜=œ”±7Øa~bÓS‰xJÒch•h—àJïTRNjÓóĦó§*³ ‡î“Ê,r=I„th•èÔ=Tfꯄ IeÝñnž|#+íI„&E%…¼õÄ;ôzu|w¯5Ì»{¹Ê¢H—¢´øü"›è/Ei)p©N‰û‰_ë–âqZtbcyâ*Õ‹¸‡×©Çš)3% -ü%‡®h]?é¡ñ|®ëÇéÈCU¿?T -Þý‡º~Ò7ÝÏÄ߬ë'¹Ñ%Ñ.öº~Òná—n ’¨ë'mê -FAÿ¡®ŸPš$ÃzïÕãû@ÎûKuý¤¡@?ÿ'êúI¨(dÃy'ñŸ‘ú׺~ª&«ª»:ƒíº~<6´q«úqîìz9=Åv¯ë÷4ïõ#uý¤«úÝWò›uý¤®Y©oÕõcò·„Ö"ïž«?×õ“& Ò`?P×O‚×Îkç‡êñ¤¡È®Ç÷¤œœìz|oÕõ»CdŸW³9êúIä=<¶¿Z×OZ“‡7|¢®ŸØÞz<Iü[þ–uþv’øŒ
ŸÕõ“>oæFü½®—Ú|kñ¯õø^Ò¯Ç÷ö¹Wõ{¿Ÿœ$¦g·7<Æj¼VŠŸ‘ú^]?Žcû¡ª•1ô~]¿{ª”T]Ñ·ëúI«9"kìåº~ÒUýÞ¾µ‰®ë÷¦¯Of]?y¯¨ë']Õïåz|ÊÂåIËǺ~O†gUõcay«®ß£+™]ÕOì–³WëúI‡wñv±?×õ“tâù”þ\×O`^XUý¤ï…“_×ïï~K.Å^Ïy±+ߨëÇ.¡ª~ŽäÕõ“\¬ - ïÕõ“V)ëõýº~Ò ±ôŽüv]?î ùUýô1Ù7Yqëú‰+A”óä&+™uýdé0o×õcÏäãŽDv -×õ“Þ$³8?–KíûVíáKJG+7…#>ø÷J-©y{%x*îÚ•¼ç¥-rVÓm1§7‘ðOù¦hT:ÎiÙ3„±YËsÏž%Ž%Z8ÃÜ7Çy‰m%‡¿Kj›µ³öR`>¦.F²›n‡Y§ß—ó´Ì‘‘Mß_mtæ^›8&l™ŸR\u¼&<Xo<s‚O£îö3šbùXs×Ýoîu[\S_‘ìXò–æ.¤]£DmÝŒÎêEO{Ù˜—ÜÇ–n¾P·ãzñ«lÔòëÀ&ÔÙÏ£ºÝqè=â§ØÎSÂÚ¥¨VíÔ¥=øâ;›Õ_—ªo×¾7мr;#ÍF½…YŒƒæø9¶Œ!§6f#ù„\Ls¶´GS;F~ÝéìkgϪgrvO¾+÷Lˆ1l5·-΂_yK{ûµžÎ½=,6çWQ¹Õ2„“_ü*ýñiõ -ÿL˜©ÛY…à)ð¿ClÚˆžf8Œ75ÁQréÍâø®
÷ -%H x~gP¿{q„êU¶1‹ÜÃålJ2êÐGÏ6AííCòƒŽºN
-ÈÐBçFøÀ3otsEu¿ÓÞauÚ}*›|Ú•LÙ0,žeå;‰Ÿ¶`Œâí«ŽºP8Cí0Òw¥[ãÞ“¬.£gÊd\ ~V»ÀÆ-îí
4=„i•â0&ÕÑÔ]¯É8tþ®“ÑtÑ3¥2MÛføŽ8Â{WçŠÕYI’8Â6Wº<N%~±Òq a _{Ó`ƒf§&øm\G˜ìéÍûE+z -6ÿ–=;Ön‰½óM¸/‘©ÒÒÕ¡?Õ»‚ÙgtKT—jèJø¢Ë¯¬et=Ã÷É9¹©t1çM›£®µ€âÁ•æר†õƒéyqu¿ RŒ¾‡„{g…&Yîa¨‚ÞÌå µcÀÊ+ÓFz@Ĺ~ïš#Kçö›}O -û¨îéL÷±Øl¡#NÔ¬! -ü͉ ¯Ñ½W[Ý -¤RHÙò»Óž¶Çⶼ}ëŸÊf¸;èž0܈y®–W»É¶3‚Þ^7ŸhïÌ%–݉ÏÌ»)б85!OÞºŠ4óN
1‚gßaê@Ŧ³|!%ÿ¦âÛ€QT·ØMIt 0ŽØMºr‘ß>)dõ4oèj]ʨšŸ×Z6uÜEF3ãøIÌ‹{”Ë…Jïö,gÛ)Z¶Æ3OÌqÝ–íýÚÅ#í´b~{ÆúZj}¬ë߀gƒvˆ!ÈU·pôÈ»¿ê)l°JjGh¬úî‘ÃpýÎ43åôІ—nøÉɸñe˜éˆi(EôÆš î9òí©ðbÊJ¦ã˜Ì¾¢Ý{ÏÚl›^í³Ù³Ú äh#{,0[òga7ͶÜ:ë§ãù)‘C¹w¸p£}šYøÔ²OÔZEd„ó^ø3Ý+ˆCçO2ÖXÂK{áÐúã+ìîf4ñاëG n“8Ó⑃Ùû«ÍDX·p˜øKew賡`ª¸>âè¬[ÆÈÕ;†_1—3ÚÔyQ½ò‚x
9ØÄê6£ŽQ©TBšÒÄãÐ×0Â>Í&Ê€_4¿ô(;7]˜EAo#V»é°%C4mD Œ=:—5AC1}ÃÈèîî¢è¦U‹¢n ±ù5yL%Êmì(oqã\`ƪ2ªÀÑÿh‹ð~ðè`ýšïí¡Öùøhâ,âä…é’ùx|²aC¾BÛË*‹¤ûÈ
4 -A“»Ó”=Õ¹:‚úE{áX+¯4Ž†iKüÑÕ!àè@þ8¿û@¾*ñ÷ʪØö—§_7F‚Þf -†@÷RNNthÉÞòvÐeeΑy̾ºf ÿÍ’ƒôr0“´«‘Š_8±Vª=c>¤#Ì_bvM$aiÇpJÚÁDÅ= -؇q¯^³ÎX#à.¨“áÛ‹¤™yÁ;f`^ -!îf{ÈÛ!JŽåàŸ(Åû¦ã¡,Ìöw¹"¹I -m‘÷?»I -m‘ -üÓ›¤ÐÉlœŸÚ$…¶Hn) Û¡ÎC$.;z×Íw?ñ9ìf0£MÆ®§f0ÝŽŠE˜jØ›r\‡òm#‘lL\¼`ÕÑs-Þ -Ðe[öB¡LàÅÝÈœ -ÐV"3z™ð”ïEj¾yí¸TåRÇ,9[†¨Oî¨v¼µ¢ž‰Ü²‘Ä}Jºý»€KBÅØJï ÷32Ur ÃüÍgô’J~“–ÿ·*9¤ØŸ|F/©älÓÿJN]Bêû?VÉἈ¨ÐTÉÙæÿN%XX>±ÿ+•®1 ”ßUò3eôi¥›œú!Ðk)+szê˜nجè¸Îëã¾µ"eƒ²øzt\¢ÛN ;Tf‰“ RwÑÜÐoÜ3S‡d€×¾€bÜ:ݽ½´´ -Š$ÌN5~Údv~Æäø<e„£,V‰•$è†RŒÍêìòžé¡GK…¢lº ´Ðê~:f¤£Æ?QP)k·S»Û¤Àqð¤>¿\°{˜˜ÿ¬v…ñæ'…ýõ¯
ükÿçúçp»Ñ^?xà†O….1>Ïõÿ -;>´ÆOb5½¬ö»ñé?ÿðQ§Xhf‰tÃà?è‡mš‚çzèy‚¾
¶qð_çÚø|*+l›Ãév -È/<†ûŸÀ -ŸèÿöÉgŸþìóß|ú¿×ßãýOþ¯?þþò¿ÿÍÝô›»vÿ—uÿ«ÿñ
ž•¿Åg¥oñYákŸõîo%–X xóækC‚@x*Þ¾ÿä‹/þ,Á`W~½dø·ý?áÝñc#¦ /8„Ý·þPFK½[∈7é÷eay®ýþòLí¾Ä‡°P¼6Þ¨ë_—xÊõ¡…Š8Úú·55cýø¼;®YÈÌsí‰ã9±
3ò=™w¤PÖÓz9þ=ŵmðû)L^~üξf¿Ë~Îñ¾§z»vÈ/¯øŸùèõ×¹6|Œº¿6ýÛ¯ñié¡æ÷Ø›Ø?¿”‡ÒŽ¿Ú[¾½Û#1¯;îðgà'×4Ùl쿽ŗåõ´8O—¤Tùùû1>pü’Ø«ì‡ïzú˜·Ï|¨OÂ?Ü=3“ÏÍö¼¾Á3«v]ÙÓÊ¿½{OÑs‹°·wÏ¡ð)RoVþÞý»Ï¹™¸üXJk«”Ê}|ÛäPÇÀù[#N8Ší¸þˆô#V^VþÞ>·su=Ó—yÝ>—‚öÞþZRð[—–”ü}ÎãMÌã7ž˜Çš˜Ço>1wÏ|ìyl‚x]h#7Œ•ÖøÂ}m¶Ø1[!ˆÖË–šñŒ™×Îã}åaA¾áGÊœ|¥µK¨x¥4¾cMÞXcy=äÆWeýkª÷9¯÷Ñ-ù¡§¸>šéÚ Úœ3Œ¥fö‡:'h}4þ”ÚÈk²5²$jám}®·c¨!½òú®Ö8‰½ó× 0ð
ùa®Ò¯õuÛÚ:5=¤Q’ÍÇÒ ËxˆkÚïog3½..-•Û½ø§o.X?@°<~`yü†‚å¹õIø÷µÏ’zÉé(…ÇŒì¨.±ãV«õ¨!k/ü´µ×¼ÏÊßšP•øƒ#Ï¡‘ž×¿á‚Ü›£gà6÷€O˜Ê\ð…1׬ûj+^×Òû}ic1V®øx(evŒ„–꣄|Ú\)WŸ‰¸@&õ鈕›½™†ó-¹ÒÖ¾ÃXšÖz®„‘¾6·äÊÀ䬻©>ôÊ{jNI_1ê²X×+,PuÉŒ”—dYŸ±¬¸®ïÈ#² -¹¼ŽW*$Ä\`*êÃZÇŠ‘ZG”ÌH}uäÒº6d\$SYKY}¯¯Sb¬i¥Ð¨ë`ë„óXzŠî[3Ò×'f€£âHâ.ÍKçȱ!ÙÞ.Ðl3³i$®™†ª+í»=7¨¶A7µ0΄3qéâimãû¸vLò3qm4LÙÂiëuq(öÍ{Auaxøž°,½R“Ž-GïÀ^™ØÏàc½ÞRÜc)U·A»‡¦Eq·¶\N¶KQë¾°ks¯ïÄê¦ýTÄ‘]©úÉg‹äXXŸRZ| ¿ùP›G½¢ -KPŒµZrGk(¹ÞòÁ3Çd:c~Ôä…Ðud±¥Åòm¬‰Ç@M¦éÎub¤,µÊ!Ÿ–nÃÅŒ%ê4É-Qÿ®™8]¯3Ó"\2ºjêp¬ù^Ö\Óð=a.|GÊtŒ´€ÍÒ´ziûô*PÌÖV¼ -¿·„ò}\ª™±…ðÖ5ë¼Ê¹êkg>ïëAØ-}Nj÷ËÐ̶â#ó[Ý‘e3`B‰®®a½ÖûÆx¬ gòX¯:ÓxÀ<}¨M‚±"Ús)ÖfNí1¼Í>èéËÂ+Ûݽ¹¥ª±e@&‰Þ—們ä&NS, ŽiS»––OùL
N0ÌAÀÅ}‰îJËʾá²HZ{Ó´z]Ç‚åóC#©dºJèÉa‰@P9yÄ|]?‹IÌÓ´Ÿ‰oxtkKÆV,îzÉu¹Ö¿d8ÖþH¹k¹×ÞŽ<h–"ã¨ä¯éï•zŒPI
¡EwÝø4‹5°ç^*Oj“਴ˆkÖñOTz¬Ÿx/Fawãr -g™ã²ãé#Eó2„uc ¸†P .cIÌ=q±<@êÄò(k%—12Ê$r.²zós½õù;,Ø4,K¥Beˆ¹dê\/€ê¸uý¥Ü6à‹êËz¦úÀ²´+5Ù…Ë´þH
!h -Û”×*ð0Æ@2e½e3m©ù/TθEe,8êúƜϢ’Ö´{¼l}à8|
’òü6I³[ô˜dðY& —I±&ï ’³Cr¬ƒã-5å:Í1P¶O«Ø+,œ -]X¸@/fèÑDeY¿LU£´";’×,YYÒÜB3T”õùœˆ•c¡2x/œ-xRIM½ç}öC;]Òrà|6
a‰ÒuµCÏœ§:‚9˹ððÑØ:\»ëç–ø¤ÝEvä@a9gÜÂ’[e@·ó¸äÌãèþfÕZ{¨¾ -Xž>Ô&áŠKê“xß–±“YŠŸäWXfØ-ùðÑ®í—׬æp‰1ñª» Kê\”0]Xò_Þ #¼™ó›Å`¹p–è¢uÃ’Ðà q¦"TÄuÐÃÆK®=`Ó>ú—Ý>a<5S\×9²“ûõ/µK¦iX…š7,sÌHßx¨†¶þ”–J™a-ÒI<àå{¯me‘ŠÑõX˜G7X®¯àÜU6Çrµ2_CìàæCm®¸ÔL—ŽÉOîqÒ˜«g`N(dÌe‰v>ßÂRpïã[_Óvð -JŒv¯M:ÕÒ”"Ù[eÔ§u7]–jÈ@ÝQ6wy}Q^óò,—aň–ûï²äî‚e,£8,yR¯Ã˜îGþ|ZVò=€žf,sª”Ÿs‰Y×-ÛZRÀ2
†¢,3îËSn -Âr"ͱ1Ã%A¿„°¾ÁåªýþfõZû)¿ -`ž>Ô&Ái©bYfN<Ÿß¡%¬?1ª%‹}s½D-ÛÏM®13:—Àl2Cá·ÒHëKPrQZt\ÒÈ… ¥i -e2ùRÖ¸šÜ1©GX_ŸÁVÉ4èÄÉØ`j&ü™aT˜‰8äðäï¯Oï -¤úð,¡š–=½ÄåÒ.‹P¹Œí5F‰P=×ì9T Cec/=&æ(`2ÿ -HR$p‰g8`×m=J<#F‘D°Œî…°.;œj(²I -£7‰b’àfíô ¿L0JY -„z§þû‡¥N)lÀUÄ©XîFõKgy”úuÂÑLsã¨O¾ƒù;jrjª²v€#ø¥1²O=hÈ$n4'2Â
×
O´«}ã(¦ÀH…G˜EódèÜ튗@ÀÍ>ü¸KüÒ/ƒw繋üû¥ue”.3cÌ¢D+‰rjMtN8šëš€*ß7ӡ׫õJC£%¾ærX:c®”¸©çŠÖ¤)ß?ÍyH$.¿¡ÈSdÒêÌ4AݺÍ&¶ž"i®Í¸‘d()ò“Iˆïâw–1¯ÇHÙfîhQئáÔ‘
VT@‚º‰Ä%$Òsî– ª•Iiqh"¦ÒÊ3Ò›A«Íõ! ÆõØ@ZV(ÓöbîKd0p¡»Zfã2aúúå%áL]¤+P°Ž[4Lð¨ƒFéO$^[¼È†Åšä™:»-~/±4[=ű W,•¥©È•Ç?K2Yü£KS¿ßEFg0!ºk`bDNæQΆ“¹£t,™ ¸ûFS«É0^
M±Ç"3VÁµ¢&¬Ø±¹Ôô¤”ÂÀp‚²³¼"Œ>…/8?pÞõØý6æÌ4¨™Ê·^pFä®m±”h``d¦?AÝjÄ™Ž2¼wÌR$‰T -®Í@]×ÐF\e0NRŽYæXÌ›¬²ÜŸÀ‚©†qÿ °Ú^Œ LC€‚Ù(™zaëò¥¥T$¸—¶SÓËÓ¿‰$¼ª\Á%î[ £¿@~ð‘r‡Ä…‡qä×Õ‰2…u6(JÕ£)˜+ó…"ñi¸8Þ)¬H|úÎæ<¯õŽîiQç©Ò"òªæ£w^G¹P0VÜC6ÍÐcç×i|¼. -}í·oýZG{Tª+L“2½@)úº =VËÚfUhÙ1Ó5àFôôðûeίŸ6à ïq)¹‘LÚ…<¡4¬»ºr}³T\$¦¹7¼£ô¡Þ#Sù¨)–úΖem:z*±çéà‹ò×׋Í!V:×b*ÓF¬©Z¸….ð¯õl85L[`Ý5t4#!6Š¯2äŽÅcdçÉ·ÕÜ»u‡w¡ý¸ÕVÕ*ï)xÒ2d™’é¹ÄRÉ(ƒ¨IÍ"wEˆJ°Â9:Y·‘Æ°XÃúÄšÁ¥ÁAK‘²Á³F»p ˆ=™”S›ëiÑëÄ.‹2¨ôuÉãöÈdéQ¯aÈuf«Õ–“´Zý,~ƒ…]šÝ¶V.¯O]c3(pwWqCÍ*¬“ï×Ûa¡ÈDeÅøP]¯²*¦¨Ð`sJ¥è˜¢ÌкU?-øŽ°,žÜ=?rô²NLð¨Žñ‚ƒ6Gi=<7âèИÌ=‚Þ2aÓÔêšJ™Ÿèc·°ef&ME½ºè"å¹î¨AäÉ]Û«Wݪ¸AQTHo!†!8C“MáJàÉKÍu¢¬Ï¦CV(‚y|D+ö[Ó"Š#ñ]{;GˆjM#JJ\€©u¯Nç,ÃÜ´„Ëê †Èüù-Xê•dk¾ŒŸrYS’š!tí¡ÎÚΩ‚‹ -µ
}íxŽˆT¡vvÃÇ3ÒmF°“‰b¢ÂDpà@õè–!¶’ºv2YX½ÛïŸ~õã\MƒIäòÌW÷7auµÓZeƒ"SŠJßÓDEèKüÇB?ÏgÃY’sŠCÌ„>°V«Naú½Ö¢@£éhJwd2ÈÓ·¿ªÍßØ]²V¢Í³1ƒ5Öôàõ-ݽY -i“?ýÆÈþ2|OÆñ!œñ4‹Bþ˜?™•…ÀšíõüâJ8ý¼«ZÌÍŒwÍ -ß¾üu.^lîC/íü戂D‹ D«dv»fvO¡êªÊÂØ {wB˜²‘ú<OR–Høåó¬Déþ'?ûü$"Š÷}þÇß}ôþwŸ|ñ»ÏÿåçŸþñþþ77¤D‘ÜGFtßó~;Ï>ü;}ó_-RüÊ}þÅþâc2·ýÅÇðZ,½s-©ýùâÁby!W‡÷ºF6¹›`Bž
1Ä·ì"¿]wÜQ]Rt]µ¡ÊwÜb/…«¾Œ’ê£?üáýqMãýGÿöÇßßÿâ“/þøé~÷ÿ}úW ÎúÚOMäšèßüþŸ?ýø£ŸÍÿÛ?ñéþýÓß|ü|ú§uÑšïŸ\áò÷xÿ“¿ýýïßßÿåÿúäŸ|öÅñ¯?ûüwüÝ'ï×ïÚÊ¿òŸ>~úùz%
¿1õ'¿øô“õ¿ùÝgÿí·¿ýâÓ?þZÿŸù§_ý•Á|þ%õe÷ù§÷÷Ûß~úøÇãËýŽýõ?ûü‹?~òùã§ÿô“?~òñÏ~úñÏ?ù_õt‚þîúøoø‰ÛN˜ŒëòÏÿù}/…X -÷¿¸†4qýꣻW_ª?S¢þ<}q÷×gB²Û·þDÇLE(.h†uA!ýÛ:˜Ë0+.IJƒzú1‡õöUÌØ‚¸GhŽzçI}g™î±lN ->‰ª9³¿Iö%™>b‡Bj¡Ÿ¯BZCLòP
³îù} “è~_PøU¹uï¤6Å€±Š"\;† Áçú`P˜òø9ÑY‡#fWÑÛe9-*yúÿI¥wŸÇòƒe6åè!4G=ŽE”óøˆ9Þñt•½u‚ÛÍ5D.—ñö™Õ}÷Û»¿þå’•Óä≵îƒÉêø²8QßÐ]mÊR‡ß a:-®*EŠh¶Y«AÌío£ U´ØÃpæVÓøk,µîe™ ¡º¤Ú/ðýè):w1Ô.?†1èRx)Y|2j7¿ý¼/§¥{f|¨íä#…ýZØc˜Å†¤r^ho§vò··åµAØ^ôÅg!ñãæåmà©2pí‹àöÔÔøsŽ‘ãçöØñVûIûÕ/Ÿ÷ö«ç@õwÏÎú3KSŸ¼Ô³ý
·y{÷SÏ‚îéŒ?â+Ò¯x¹Ù½€îäG„ýˆ°çö÷çYëki£ƒ9¯ä-ë65zn¡sß×Tsc“©LžÁ`NÅg</ª·óŒÚVO9=ÆP”{{ÕØgéù?t}?p}?h}?p}.³rƒçæéf6Q]¤Ál—Ég‡¡äÏJ-&j~§JClŒ#Kù±‘˜Ìµ™Ê‹êþD–o‚Ê÷R>&}œ(u“çy*ý -ܨs -ózî`¬8hµ_àÍã?;›=¬!o»yø©`°YÖ^~`…BQ|Mj`«#}>!7ÃûóX}2á’%úPQùøa¢òñEå㇉Êǯž›©—sîø¡âçæréúÅ0ÖPeZ s¯Šñ{ÔÚ]9%TQ(åPÛ"~á8ŽQçnêqßÖ`µÁd?Ag¼ö¡ô^Mî +ÈdJE]<wyÏf{0fØ$°½°%öoVEà0H?º^!8H£'81;‘kMy”Ó¶gKáŽ\u`Ç°^jÚ‰ëÖÝ€n ‘£qûpçŒMž}!,š¢‡ex,Ø3±Ç—Jþ2þMÄÕì>Kz1DÞ#»µ2¥Ó»…“”o¼¿O:)±…<‡ˆxz8ufÅBŠqj‚v±gÏ\€tÁ/)d^ù¾ÎÍÔK„ŽÇAøÚnÍäµ -ª
L§ƒÂá)íZ܇s,×ÝP€ŒµrU¹€?„ÕY77£œ0+ÀzvHºÜ§±ûŒüPŒ(¯<=$Á·£`ÇŽ{ÙQÉ:I°zA[1QÌŨéþÉì\W$Ög”ðW†ÊøÜD½”=èxZC„ÛP©Š(¤) -7¡î5ºþ•¹µ -†N -)bÂi ª9rQÞüƒ÷ld¤’#»5h'8¼«‰eöÕ˜\›‘"P£).¤Ä¬žH•,DúØ|h#1Ž-POü Bsxy£ð4·CáŸÌ‚Á2[v1þ¿ÒÝ5{±ËBY”øUƒõ:6S/§:˜Û!KIùÈÁ1
¬%µl‡dÉî=˜ÒÜ -ÔE{ã†Y`S¸`•—®›ª& -‹‰Äضn?šÄEX׳¢P>‡,ÃucR,€ÛÖ³+R¶ FÌQܼҳ׾´Seà„5Ìsÿ“â…ÇAÉ–ßÄjMUâk›‰iô\=r]yšô²H_2T›ºÛåÈãÄ^×3´üê1}™›©SÏ‹ÝqÓÒè)t¶c°FÓûXK¡îÀG
¸Ã‹–%L´2M -–¨æ»½‘‹¥è¢è²éx\F`:y#†ˆÄîÔ¶
;ZÐÈÚ«[ç]Cc±o·Ù´93ãev/kʤµWŽëëØL½œÚèpnOøcØÈÖįˇ)®pö÷ÕÈœI;TÖç°Û¸ûÀ§µFj&…KKrŠxØ…5·é;É&U’Ù³ëßæŸ8¤¾u Y9~1ç.jàÍ;1BÏ–yN×UÐh‘'Ð o“6fõ|*š–Ì2Ý~C±…#ï:º¿‰©™Ô s½Qmj/+êT7¯Õ×9°™z9/ÒñÀÈ·«ËÅ y+¦kÙ•˜ÌOTÓát+qNS´‡kÑ}‰Ã¸¬.ðØ$™iìòA:î4´S|#B_ß?™d,&+¡(eÝôD@>{ß Ž.7R2{&_î2j+fSÆJ•¬[¯^O’3»mû˜‡Äwö‘›™½,([ݼrP_çÀfêå¤JÇ©º¨ÎI¯ÛC4P7_3$(šë¡šb9Ú¡IÄ`¨‡y×›«ÕÓ€Þ˜Q
Q,3R˜eÀtŒL“ÕªÑ ¬&øÅ&OÅ:ï[åß^À–ëK¸KÅÄ÷4i-ç†À<cÀVò=5›´fé>%G‰ÎKÛ‚V‚¤Ên26Ø$n45¤jè÷é_ÖÕ)'_3¶¯s`3õrr¦SŒ}ôx¨!¶¸•¢ö_[N(.v›Úía§qŸî¦3¦8Øû°øBœÍ–L¡C[µ×D6Ô›s£Š*“[v|¥ŠÜÈÖ{ÙS1à-QÑÜjJ¿¦t6ˆH²ª¡èJæ.v3Òœ;¼‘m‡0‹aœšËX¾Ø.¢ˆ³{³¨eóÑ¿^`?›©ñ;Ï:¥Ó0Å–bÝ㔶ÌÑÃRW]“rßRhÔ9m+‡³í„C'™·d
·šQŒ¢5±p6±2ÑõfÉÕÐE¸Þ“BÆQp“«Õ†•O±x…W«æ©GIY@oJê š2䘸åÌJR£] -…r÷/Íbª@qVß^Ö¤—P=|2µ—µìãµê§s ‰z95Ô9ÓwPÍÌï©[kpź©ÐT¹ÆyHn7ܘʋïLŽD)”Ü;ÀÒ{3E%mp’~…n•Ø·¾‘d»1ýÕÔíbÚKõ”æ:’k/Œ×Ñi'»¼BæÇ#‹³»ºK-¶%†ù¶{eØ;aÍ2k“ØgN/äôãÕHÑ”?[f¶]íL@yœµûW“J’Þ°ÇàáD©®«Ï!oKs„uT|Í{â26O/æ¥:iþðNû–`X·¥%¸åøBo¥¨5©žAÖ²R}í–•–ZÕ—KÛ=D3ãå”Ì*±#¡æýH°LMU+kÄÐŽ:¢Ír²‚½]SI,O‰l¥Y‰”"LðH[ÓÊ…~•´ƒ1ɼÜ8%̹Éغ¶MßiòetsÈÌbUœL®‘%ì%Ì#›=¾©±°oÈ´NK»ß@v:ýÚ²å’i{ÿÕéHN¦Wö”„ÁuFG³2vë*3»¾”·HeµÒì -†¬2°ú¹+ñHŒdoüѬR¿6¬ÄM7MU -F+4“š·:4éÃôëùÑÜ$@؈`ä•px8G²{Lª•p¨*‘úÞM.+þÈ,®yèèQÛÁ)!N 3èÿ0@ÇÆOòbº¬Ó/€½e+ÄQ¯–«çÐ-à
u‡¢Nñr8«ª¥x•K¯ -8Ÿ6êuE^Jç%E„ñ©í^ï!>öðåP‘3ý`ßkŸæçðñM4 Ü›Ák -S(š¹àVcž&œw;^7 1f{ -ææõÏ^HóÌbÙêuà¨^(Ätõ9kJj•’]†çÆUi(6dÂ*mhkQÏdBwh<ª©KPìÍéXÝ&Xâ‡:>";ž¬øJK±‡IãPÛ¾ŽV|°5›%µât½è™ ~)×
ܘ¡È -Õw½`RsÚun'-Ã÷6!*)›Ö‚EÔ -ðŸAC/s÷ o'T©}Ie¿‰|<¤Å¸O?Äkú8Þ…O©õxÛÛïù2º¬§_ØÌbÑß‘_½.øõúÄhtwÉÔ”ÁI@¿§&†Ô›I5‚h43ïü oØ[7?²ÖM-±úw_Ò‹æ`?ÅN?äCû]ôÓÛOyû¥ßj“ñwO'õé´'oñtù®|ÁÀÛ»§0y¤ÖÞÞ=…ãÀ^!paÀú`WÅ yE ùûã“£zÀž<ˆùþý‰i‰ãþ÷~ä3žûø!ÓôøÓôøÓôøͧéñîK?ø2!>eº£ÈlÁÄ¥ªkØŽœÉM%³sÝ,"aFk(%Ýg¡Ç£r幬eûá,Ú(ÿðèGËåç¿4¬å$ÚÞEô‡@u»Ô••Æ’ø9ßä bâXô™–ä‡Ðº¶-Y‚&;P×Í©©„T©4E¾×Ú&åÞ¢íܹ¨.bg9LCbƒ›hŽgôSÍ’J¯‡:ö蟾±¸yüqóøâæñŠ›/ÿVŸYÆŸ–·û‚Ì -š¤‡Nn!~ÚRÆ÷ÿ*ÄÇå[}6œ¢êC¹Peˆùë’HãÀ$3“Yu_v(a®ÅkZÄ¢ÆGÌÿFO£iéíHöb)°í’7ýÝÂ{äb/Õõ\ÿ~l•ž”YtŒ£æþ»¹“_ô¸~ðuBNSF× †‚Ýf% n%°³N^ÀLÜ•¼²;€å¬zƒœt^àÕIeš"··>¦H62†à -ä1ÄnÕ¿¹(kÒ•Ó”¨ý9É7’FS[¾BQ*£ò¦±£#ÛA==½! -0j<)è›4¼&éH‹›oõÙx))¥?®"L]Û@pAô>ü -;²Ë+%†-ïªzþÃbE¥nU/t;¢°S×Ì¿0>TÑÉ -§˜úìáï,rOI™0xŒuÓŽU‡¢ ¦Š’V•GIœQ@jPƒ5´cÇñµ~=ñîh<ËÈáúͲö„R^ò×›¥K¤$i€c® ,—´r¤æŸµ±N1¢‹vˆÚq{žƒ‹ ’³Ë¢œP°,—_ào?ÕçâeŽÇÃÊ …öˆd9Ô¶(¿Ä¸r1Puw‚@ÙtVÏÍZס÷Ñ3ÕÐY¾D$Z¬¯Ø܉MÅÅ0ð”›[Yg<ºÄ2G©"Ï"Ü¥ËA
Áž×ÍR¨ñKÈñhéQî§zDó$s°#¦½¤nl–Å—²˜üÐÁ,QþCÌG6²s
,OÅ[,©E ÄGOã+;OÜÍ2)0ÿ: yó>/ãoô‡5e™™FJN@‹ˆ„ -w¥ô,T7ˆ_¢‹ÂÊv²=‹¸MyÛhlB‚p¸A¬—ÝV&°u`5L+ÎÁDA±O›…ó•X·ŸêsñRÖÆÃűÞwƒ’2¯Y{[ ’ZÚˆî’hÄèZ¬dR2†Á¶Â*îRÊz9´ªd%*ürvíÚ<ÅsæÐ窂˜âpRå!D.œÓFL ‘kw%À‹í2Ym -ô+0€PÝH&E#YrTÎÙÚýuânVjS„¾TÞ|«ÏÆKÉ
¾%2)œ*Öj$¶Îcï3oÌÑ0¨*cf9Îü¥DF ‰Í¹É¬fè|Öu™:ãÚ™:Îï"ç)t< -½ž’…ù…È0Ì8FÖOÆlÕ`Iä¯àÊ"ëw¶êiÎIF‰aûˆ Oçñ½¤¸"¶lhòZ—X—#LlHÒØT¡æͤ ™££¼@^¾Õ&㥼„ÇÓÈÊîR2Ûì[êaœ…ר2KwäÊÐÛÎ{&.²je¹Â,Œƒã'*»"%
~ñu€Fde+LÅÕZ–¿€Læ@ŠìãÑñ9+µ]E@ÃÓ_@Ê÷t#Åñˆ?Š,ÅT_djᇡ*$$„ò®CñEÛf|W¶à?7‰Ç˼¿ÎÛÍ:¥òJ,ïë·úl¼”PðÁ¹oP²¸˜–U02T¸«‰8ºèa.°ÁŒtãB/Ö]¢ì´ºÐ‘$E£ ±%Gƒƒ(ÛÊ7ñE¡b´h…†DêFŒÙP=g¦ÜÔŒ¯Ké\W•3ä$Ø¢èˆ"»!*‘&òd|?FZz”£„%Ó>¬2ì°º a©9ˆ¨Ã]NÄýA(‚%“a>ÎnŸ¹›¥2B WËÛoµÙxàñ¤>vF -‹ÛØU˺—%¸Á\¸Ãú=ÑL’el j8ôèîŠ×b—f:½aèuZ]pD.5‰InÝÀÙS€Èµu:9@Š’¬z[Â5¡0]šé›ªV”Ýeçá0ºcÈÃ6/£eRä¨fzèQ¯'ùéT°—qðÏ|Ïšt_’²v1»”j›¸›Eª¯èì¾ýV›—úgÜØP‰ú<úAŒ)áÈDx2ÁtÀY!T'…9þ«QWBÃà-ëÔ
N¦¤¬~L^C(œ±Y¯Ùšj~S·™H1D ÐR÷$Ü W\¤–$„OßÄ$™Ð‡Á½ApŒâåXºÃ;Q#Úȃ ¡8•ìØi¨DtE(6Å*£¸b¯w³Rmö×Oò6/¤Ô; á&B=oãV,\Lúðl¾:uj##]!*[#™4xb’Ëd‹Òþ+v³–‡ºšÓ4d‘,D!‰‹Ôk€¹)o¸´¢ö“DRÕùW–Ä…!6U.Á‚ÛŒ¶ú¥5ý -š.4&V
UõÈNò˜¦Nò^1#ïL.ÑfÀœÇv#ßGxÎV³UÅÝñ¤Ž~l†P3ËD&ó(¹ô-ô2@4€7I,Å -‹QQ
Í›Ó$µ0PÀ·elfᇒq0è€'tÂD2´ Šv3ŠÙE$D¯NʹƑ=˜àb§¥^èåfò3ˆ~K³ -©$¦P'ùmRT5c3ïª"
(`ÿiðÄKz»~/c’ÃÑ“¸ˆ¬Y`èpÓgª#1M}Ó…‘OÇþ0îê€Ñ_¼³(r;ÈoŠr1m!é -YrÈMdTùåÒ$Èõ«uB¶î:f¡Ö¨š]úü'݉wšÑ³ðØ´ž¨L5 -<éd.Âe,cjE5üÌ‘ž2k>HlHð¼¿NøùvÖ Ö)½…:øgL›&ᬹ¢œÑ¹ U9DfGUÊ£ÌczVCrt.²`öQŽ"úE - -TsžCIHÁFÍìbPmZ™½’î@aˆê!¶œÃCª pÑ‚¯9…ñÂtÐÜÅ®ŽJö@…Ÿiú¸¹ˆ+MèÀŒkÉýˆH¬Yö‚oä«ŽT_‚5>9r% -QYË?ib€
€Ñ¤ÖÀ‰^fxðŸœAÎbOtó€¾µ¡9Øõj·³þ+>TñoHgŽRJCÁ€‡Ð™C§É-¾`B*2šž0/ø9‡°F‡!¼ÞÀþÉ3d”…mrn †€ÿ"4!ô2Ç“8Š´§™TM¦&Û0\ó>Ô‘^6DÊ@Gœ…ðëß{Q¹Kµ@&¾¡^®ý;¤%Œ„˜i
x[E]³ìlJÀ^ê÷ -5q¨Z2?ý2‚*s -×Á1{Yrt[ -XËJ§ å6?¤éVËhæßæ¢9^3DTXÍÈ~òò/ä±+`ìñlQ Ï
u2ø0ÀYn‘õ¥µÆ'îWØÀÇ\€×tH*™%‹˜^N7Mw
P5ä¬Ub[IÚ¼xÓl7¯þRººgm(ØéÆÔ#2/i*vÛ³#àuK¤WÈ¥?1$Ÿû®Éç (íœüGTž·ÿˆQ|ü‡4p´èÜ]¦P=.ÇQl—ô*_@ž÷ûr’³"Ô£KŽ(
|Çåz—}Ü·¿„?Îðþ=cË{b}ßpÜw‹{j)â°qßI×E*Ò3C°ÀÛönß÷t ¿óvÄùšÉùX6a…q®Ä¸¤ž“"w_ƒ”âx30ôÔ,“Ç;I‚ŽJïî”6‚L+Tý¸,†PÌ…Çæ{9î¿?Þ‰Å)~ ¢nÈ~©žŒÂÈýÔ8aþ݃öQÓZŒd$”¡ô›=áö -Šî¶¸qaÖlÏ ›çD
/vQóµ‚ækÅÌ'6»3eœ#úƒyã؃ Xr<nüìN¥>ô,Wû·MÙVÕ&IGÞ¹ -Fü÷.PŠ×6Ùð§vß\Ú=~ˆ´{ü i÷øU_m3óR"™ý¼,² •ì ¸ì"q¡fÅÖ'@
£ª‡©ë)e½Ù -ÝJ¿•NåwZ†ZÃ+Ô^._m3óR¾›ÓóXª.øÑÊÙÒ˜ÿ8LUM1Nþ+¯Qĉ¬6Êš\öÙxϱ$y[ÕnŠr7Ê·8«é:ÖÌñž¸5Þ£ÃÅ’úÓweM°ø4vƒòP«‹©Ï¶¬Ë`
µ(ÿHe%4Fzv
ƒ){Þ†—Èœ&-ü2M·K£Îã¯
—¯¶™y)ÛÍéy¬:¿±Ñ³7àF6U‘\!m„¬v“!Ū-ùÓ™UÿF#Êð;Ô¼(5Œz@“ŸtMfКÆYÜ.®‡½‡©œ5V׋լvëö ¥ 2Õ,T6d6£;YVÏtõ¹9?;2ïìˆ!cé2¦ÉÊVÝîn:'’;’Òåd6ÜXÞ6›—dù«ÃííWÛ̼
çô8±¹hðÛŽ¶è8´ -Ílùlx
£÷À¢‹1[C bRÇTk“+ØYc°eƒ@BÙ˜ðÆ#™GK¬öP;Ëvd
ç“(‚¶ç.RÖšÏG¥K°ïZñˆÓ$×fŸ”ãD}%K)Þ(×ÝNú1¶?#Z§å˜ÍNç÷²4^xZ>ñ—¼6Ð^¾Úfæ¥l9ûyIÎŽZ7 -FÛ²Âo»T¢Äi‰nj™Ël÷ò™èmî=R
&l¦í7+”tÃýƒ$–m•û[= ×–í¬iÄ,iÈœ•ŸB»uÚEI%^¬mõ>ÒkÍ!‘,uû:“·«K}…˜½|µÍÌK)wNÏã"š¨ef,Ö…|ÅÀj3?h¦2¨™6ÉìRe»²U_½_«¸¦)¤.øºð#&M ¶dYl°˜‚¼Ã,0 ÖÂô³w©®“°!Tt/1ø'Í#«‚
*Ò¾‘¤»G<TJâA‹¾L&àÃy5Šç*8j+òWÃ${Ö˜»÷2—·ë^¡zpóÍ6+/åã9=/íp¹e¸û;¶!ürÕO²6É<4ød‹ ¨|5 -ê,‹¢h5÷ -xYæ™å£ÍY\CI„ÒÉ›
Mѳ£Ã½æÍŠF=I}`(0hòÍDž.ä毮O¾šóòžžÓƒÎ©„èôaÛÃâ´Éåðîd¡•°55v˜ò'›ÜÛÞC¹ŠÐÒð3~‡ÒºÇ÷,ZµÛÕzÂRYhŠ´ž§•ç©öïº1_D3£ì•PZš=¼
y¬êUÁðœ\¼$[ª¢ ÑÉÒY -D7Ø0›kzXئ¾™ËÛ…ëÏ,í¬7ßl³òRŸ“èæIllËÍ–" ±Ò`“i2îMàn˘•ü<IÕâÄgÉ!ˆ³¥ã¶=‡˜UŠÊ³?y— b!æd ~¹O -£úƒº‡ Õ%’†‡•à½7_9¹ -«5[à{ZLºSšdkâ<apmáÁHƒY¯ßáºÉõX½GœT2ýT/¾g¬[9ÆLŒ¥ˆd£Vàæ³DÞÛÙ1Ϫû줨îÎhÖ*s±”Ù ¶ÚF·›T«¶•·8Œæ5‰å3¢¨ˆÖ›-^ÖÂðø±9U–2I¾9oóľHr,q³"}ôʺÊì:9•luØdz»b ú}I˜hÒ¢søá «àhí¢‹Õí‹:óôV/¢z}Œäê³í¹lZ˜]SüƒÌQ9 Áš5=Yo'ZúÀ>êŒ{š¦0ÀÓü™âh5ž$Žyn`f;°YØ }f¤ÕCÁItAüúhŽ^KR-›¢…ÆV3÷l6›è<¨XïO¼Ê4x'ºAÛò¤ÅÐ5<YQFÙÙŠ;)6™iЛù„5kdx®NMî0ïXu½*º^FúÝw;m/d
aº¹™-&_«ÝØYæû G²ÝÑó•†Ñᘠ·ÃÍ9ŽxöRè§UœL]C¬ŒO©b4yÏvÊÃõÕõ¤M -öâ<«–¹ØÎÃv>V«zýü+ªp-N/¯ÈŽæê}Qå~ëìUföÛ|Æj)‡ÈœR…É_ä©’³,«ž²&+Œ1$¯Êg»·iBÖÜgîãÉ»õã,û>‹¼‰Õ˜;ÓNJ%¶Dï°fEšÀ®o1(Ú&¨pì*¤–ÈåÍÅ(˜È]lÌK†v®;è>™¥0·0~ï‰<ð kÆAX(Px"&+×yÕ%+Ü)¨¾ÊÛ -Óc¹æVˆÆT`y -rö[”·ÕS]›ÄuUµb|°¸EÑj‚‰êÖvL6ÏsPBôI+¢>6-g/i©F“«¬‚Á’ÕÀ°hÂÙÜQ-»8V,…!W+ÔIžGyžÊó`ŠG¡gù¤Vk’k³Z>ü¸”ÐÑÜû“ð„õM-ØziRl3(˜=g*(~ekž$j±Ø$gØTn¾ã¥4=_b~©5s|àL3Ý~à¡8{¶jíô ISƒSpÏDò"ÌàÙ—Wú‘Òç;¦ô!P›8}Š©òÔéŠÁaOý‰ºø= y¤›û?ÌÓ-*P±«ÜŽöÒ=]ô¬õ_^µÿ`Uƒ°÷úañûÀ®K³úzÿ÷‰ÞçÏ ö`k-âB3ñkcYM˜ÞÙ¡m&ÂÓ±ª¸Ï»ó½ÏqF—±ipÌä„w£Y²“iÁã(€ûa¿\U®·¥RåÇò¤Çè;{µ·W¿µ¼ü0™þ
§HµÄh|D§L9ïé*¨›Ô §¼Ze±löá鶖LŽM;¯ÙWoZ½3°tö_ñ‡i¶ôžÑªÇ>?vZ¡}ïscIÍÞ=ƒ£ÿ9XuÞýíÝ_|ô³úñß}þ›wŸüéÓ?¼y£¿ÿí§ÿò»Ï9r
V0hµë{×ÿ†ûŠÁwÿ|÷—ÿý“Çÿç“YàÝ— Ž_ýüÝ/öÓûÿr\û7”Æáãuõú§ üÑú¿_ýÇ
éÈJ†û{ºÙ3øŸ£f'·4™–k'\ò]ø×5ô÷åþç÷ÿøOáþ7ø¥_Ü1Vˆ:’ØYy?“I‘GÛ‡r÷Ä-¦÷žêœ]uA@ÕÚCµ».©è§žÌÌÇPmÊEÕo<r¾´,õS±µéT¿^>ˆ5†A°k_‚×aNÎ~_Ùr\n¾ëKYžù~ÝŒ"˜b.þµ˜'±I|¤š-x»GøÚoLßOɃrü’
¬»:òFÉf׌jÓ±³Gü—öÀ~™ýßë7½ýªï¶¹ù‡»g&ú™Å˜—×yfIŸ,ûoïžÐSÝâðíÝ3P} -ç§Ø¸å^êÐŒþ‡ÛíðѸ‰Ûê&ëýF?ÂHÔ@ûëÁªbÈiliÞ¥==+z0×虉{ü‰{ü°‰{ü‰{ü°‰{¼ûªf‚luÖq,ó®g/ÈI™#mw¤C<#§j5V[â÷h§ ;句e¿eS -¨}]Lü¸eqâغ±G)ƒoHпtˆÎ=ÙRØa”OŒÕ5)ü¹ <ãˆöaô¥b¬ -qèß«.Š‰MR’˜Õ9»â«ŸJ¶Ã4•Ì–5#qLõZT¨Guò+Noa"lSžnï?}€Èzü ‘õø"ëñƒDÖW¸O"«ÃK7»Nìd°Ò¢ì½¦ª£›“a½T *
(¯–¼È¬]Œß€&¶Ã{Í)¬ -±2»ØóÁxŠ@@DCv$μ§øi0Ñ0¦ú -tl€8`Ì“t×42¢F†u;iJ݈ìP¬ È]‹½ª½ -CÀ6Z—á%HYd'\ƒZ6Æ8¸fºíõh¸·w%:‹ÆøúdÏÓ÷é1Ùãô]u·&{N~覘ÌÔi*2Ô™ àsUe5µlѾ„Ó˜çDCÐ#ùnÙ¸RGbè£>¢Ä‡B\A@‰#h„óÈnëȯ"¦é¼2pÞ?ÌŽ|¼U¤çˆóv+öÓ+:Ï}üu‚n¦‘…tQ* -ìx°˜l4ì˜Ûý1”?ý±If4²ˆ ß JŸ .+züu³5DžU‰hAî‚e²‚)ŸÚ>Òäx£ßÊ¡ ÀÙ¹PVdâA3Ø—eÚRâãëGK7Ÿ?Ë=GÐ - ƒ9àh)/ù -Ñ=(SŽÌP–[š¶{jš³›œ=ªÂúF’Å%m„;ð}@pžÅÛŸëcµŠhÜŠ@0MtCgæ*àñ†YFÞm¼wo!‚9'°®‚NErsâÚýÓ‰¼YÆì…•¯
¿O?ܦÇñk¶Ow…×Ry%Ÿa±®yõÉ+%xü|¹cÁô’”q G’ ¬ŠïÕ°¢%µ6Ö™Êôè¼<äëX&t”á`vÃ¥Ù¥y¬Ù 30Â}…Õ*òÑ¥ˆ:ø¿q % -ÂͨRb,±!J©Â5ÕLJ†•Dp<ˆ§ -¯8ióJ(M£Ï¸™½XœÀ¥&!à†§Ù,^fØ•êN+;†ËÊp/ëW[yÊïÓ·é¹wû¶çîˆ=rPfŸ8„N: -“\øBBrq’”_æªbÄX×&iÜxIPÓÂPÎpÌhÝe‚ÉøC,@xRa¡X‚F#î{Vö†Nn¸¶ˆbí¬>²›Ä#Š“ò1àð¥•Iš‚{ œîðpNÞpWˆáTþGséÖ
Ãtyà÷Y‹€t:Ò |»ˆ0Q© -S«¤¾Ä0v¦nÜé`’;-e÷Úå׆áë‡Ûô8†-²0¶¹æ‡ ú>„‘¬1F²Zörª\?=–V” \@í+ëÑš‘ÍÇÁ¤ð¤ãˆZ½e^&$âû$·éFò2Ÿ\ï@p£ù–Õ “ZÍ¥ -)HD¥YÔƒ‘è0~–•4² aë'Æàb&„Áˆ -pÈe–E$ˆwF±‹¸áÙp¹
x†Ó”F`{²5Ì‘ºûÓâ†V_£÷ôÃmzÂ2׫÷ÎùÎÛwÛaW‹Ë3Ð0¬‘÷h‡œEA‰nÌfÃÅ™¨>†@Íȇ6Á¡ÊûHʆI€ÉG݇téÂRN‘»åÎ]²·5eHU’º!®Æ´¦îITÀ4ûò!âš•©Òe']¼lœØPc¬XW…2ÅD†"…–¯¹dsø½”=§^ä,fÃÓ#é>€˜n‘Y7çâ6óe•š¥‘ž×’2ý5‚øúá6=b6oŠ½mÁÈ*€iqy&[܆âÙ´85§2'(ãhDq§c-ËŠ2c®²ÅíÛ†ôF9ÛPç×.# Ãx¶0¯]„(P%f‚K:…TßÏóàHépš5DŽåëÅÝéA~´d©È¥BaŠ#”ÌŠÿeë2IˆHª*óf2ù‘2óü¢ŽëÛ‘Y«nf&^rƒn@:^¾×8[ïYïŸâÁp找ã*£ç ă¿Õ¬ÝË-ÌŠªú³ÎŒ€jé§
3$»‰5Šq›Þ°”í>j¬Ý’Û'R¦7ÞMVþ·˜Î»ñù1ÿ+S¯í–Ä›‹|š@a ´œÒ/–-c’HVšéJÎB7&Dú- -èà‹'¦*Ê[P˜ -‡ìæΓU% -BKŸŒx0z&ÌÀ9B ÎrÆUÃ8ž¾×83j+ ¾gž€¾RGsY”g²³øCoœ
‰*±fUW´ðã³Î2EÞ©^©§I8‘g æ:«ù¯Èx)=ZÈ*
fu :_‘ÙÆþlp xÁˆÖ9ϳdë¾$Ü70Súh1e¢€ u:ÛÜäÀ4%ÿV%ò$«Ø¤•Á¯]PY~ƒí!‘~+CågH±¡Á÷c_•€Á1f‚j7¤M/¶ûOxài×À=“áÄß®^ñDú?Ê©n¬m&Ðð'ÆX–akMpd’Ú]Öwmv¦ˆvëe]áŠ_g¨ÖŽÜ7K¦U9t<éé²0áx†vÅ -:;/°dË"¬À˜ÚÀ%±@qdªAV63Œe¶ìÁ9`î“qd*©…ŒÕ‘Tûr”ÿ@a-¸„‘¬Ëé?`æår³NןvBúѸdG*7Ý>°¢ˆ&°Âô`‰•µºGú=Â8m8Cñú¡iu A‡ŠÂ`å£ê¾™9™‘NR”%©Hfñ¢†L‘©L&á’#ÁXkŽ†ÒìŸ^D‘ûÝ(š°ÜÑÕÎe†¦‚¨Kˆw#Âym#
i±”4Ü<à/Óøhc‡ÄÎâÝÉ:»yסï¤Å#9³µË÷Å#â3~e+½µª7b!ëØ®‰ 9AŽ`¤s‡êlVŽÄàøƒ?*ñ"ÜÅ=Š„&ïÑ…ÜÔŽ;KŒñ¨eã^û®VgI -u׃ëwZↈ[…›f¾ÊS½îOuJÛ - ª?ŽŒLB‘U«uµi¶uæmC,‹LÆJC¶À -G,¨JÃÛ´Rég±'a… - _USÕz¡ÓŒ
Šódk˜Êb/I;uz:ÐP*epMÅ«´31=!%5 ”“ª–¼úM%sÑhü±Ñ¦6Ñ™í½Æ°Ï9frŒ„;¬ -g挓ª(Yy¥X–éÀîŸÀaFc× b¸<•äƒ)aþšî[ŸÆí¥ôQÕ÷É(V‰Ãkª¢]…¼Ý¤j\Îd^3.¸"ž,Ëã·ã×+SAþã%h«ñÜÔÚä)U°µ£DW¬Ò3þŸ¯ñm7,ù-k>4nvM`ð&Y@»$ÑôÂHûJ^’€¶âLÐk8žÒÈqb;Ÿb”ø–5/šÛâ¡=¸êºd{d*ݺ'sðøø² ¼ð¦Ô’áçV¤œŸÅ)ÖÑ'¥˜µ×ZÆåñµŽŸZ¨ðùbŠvïr´Òí_º;4«Þ±5Œê¡2ø/œ,šþÙÄ5º~Ê—ÍÐ7ô [ÒÜ°’¦(ŇóQÁÂÒþ4RjÆ^ÿz«Þ&¾pÂ<urÊ85Xóå es4ߌ½¿Sï2_Eë÷)/áÀõÛ¿;§ÔsS鳚ÚCi [“Ô4ì’aœ±ÍÊõ8V5eä!–Õ¯S=ä‚üî¹ Ï·*JÈ=D«¹G
[:…R6[𞤎ð8ÂciWŒz}Ä1Ãoݳ‡èÉæ·äSØsúþUä‘þ&ºb¿ê~Äí÷ü°¨$ß裾ŒIÒöÎ÷‰Jò>å<Œîy&É+>/èì_ίÆf›ß™ß—¿ƒ¦qh"úH®e&x Qã³óÔŒ¡%©òiÆuŠ@6™UGX²y8’êAöØ;º²ä@ÿ -lcLk¬ïg'%ùo5ÆSÒ&j»‘Q•¼%2Ø>`‰ü’û"¸°³Ü¾•¤›(€’cQ=<XÒÆ2{wËS„ïNÿܘ/Ð{£ª‹÷?==¥åÝ á<ë±'û’Æ…µ÷-xT/‰A)rD ßà -ôSå·¡XɺÈiQ|DZ•ªã"¸‹˜ è48 ®l·í±iŽ%ödÆêTþêåO6òH*#2¸Ÿ®šjê̘¥¹T¹ð¯U™LÇœë&rŒô}×à‡¼}fz}òÑ¿þå:Èý/Q¼´?]ÿ÷‹«Dùè‡+Q¾8ÍÇ™¸ÔIz?€½ô
s$ë}J˜†á²ÔÏõW£Æ-—\öˆgi²wÞjóÈ‹zãXñTyÕýþõ¯Áê:‘Lz>!7\ŽÕžŒ@‰¾ù¥vz”¨ðIÈÕ+Ãåqú¤/ã"}òÕú[baîé Ô‘"ešü+w/¾~]Kî¸=à/ùöîBˆª\S=!æË;úÀ[q¬:®AÆŠ¾ßŸsŒ?¶ÇöùƒR½ù’·_õ¡\‘O§ò¹é~ò -Ï.Ýuy/x{wÁÈS•'ûŸö¼ú¶ÑoÂëô#D^Dþþ¼Ô3•ìë
®Œ
æù-ø`$Ú@¾ƒ!TcŒ||Žá™|þµlmOC©”vs
éNoüø‹ðøa‹ðøáñ/Âí\>ø錜g-Älcð!"ŒgG:ë+¨¿’T»‰Ÿ6¤onH¢âÈ°*\æ’êšVí£ú°"éç{Ž±“>~¸‰³Á~Ža–5Gà#Òˆfše3r¬&+G@¿È®k¨@*`JH%TâaCbåËaiCÓEìæ„·¥i ©÷Šï÷§¡Œù7RàOßTž=~<{ü0yöø
äÙãW}¨MƇÒqí瀪À&ŸÝ
µhCE1›´²ÅIhDtxÇ)4ÀÎÁÛê4ø‰.o]“¢öÃÖ Ž‘¡+Àg¤-Tõ[ ¥ŒÜsq¸`Úw¦ÕY•È fWDŒ€Œ ¶Pøl¸ÄXtᇆ)vë¯ÍÊõ¬K‚u/…¼Ú
ðNc„d•@,Sg0rÚkmš\bé9‘O‡“=dÐnÚ%››±Y| ó0w¨6-ÛÈ5&ºkĘU5Q¤oÀE¹. ùû¡k¤¸$)Š`¬ù×±¯4QÁÖ½W˜ÜBR±ðW°÷.j“ñ-1‹”ÆÏWæ¸ØÃDl—µêê5‡ÊÊgv”wPu®±ë€d -k$t.®EÚ×®?Êõt&4œ=êb++Œ0+OËÁpÆ–áé²0iâbÍ÷×™¼¬á¸¹äÖñÌ\|;<d§‡æ%«Cjdé"QHaJ@'¸SP†éMäX(:""è¾ -0ª¿·aI£+·–ç2ʺ×nñL3"¥~Fðæ ¢r€f;‹VŠy¶BliSxÒ-=^pÝ.‹›©¼¬â¼¹æ×ùÜd|Kd`§Çd»8;f°ÉXj&~@Kñ›
š)sS“®:“%èÄ2ò*Ê.ˆ;œ¿„ëTv$» l›¡+xUÆsw=n›âÛƒRXÌæ¯è‚ÅßçE”R¥@pmÓ|ÊÔc’üÔ‹ó%3ªBN*jÀ×,ÛcCiÙÕW}°çíñ’Ûe4|ýðñzùP›ŒoƒüëäÜõÖ°¤D‚¦hàV¤¬rD$ŠpPÄa†ÃpM€UÚ°øgX4M£(Ó4Y̱‘\`×\841/•dª€xèÞµp5ÍH'é´ÀOŠ®16=© éâZ{5CžÔo£9 -³ïù¯Ð[áy§ì` U®û -Y®“y»Žêö - -Æ>ˆ!Í ¦Ê–„W¦é›€UtÀêtè^&OKèBð”VÑåÖЊϖ2èŠ*bF†Ît+øL*ªbÀÈ„É÷¿†ŠŠ•¨ -tl(³ùʹ<¯bqåú‡×'j“ñíwžÊnk×iË0³¡“Ñ%.Œ¹ù™>¯„†²uײæûšµ›Ü*RAÙ°†ú@U•ÀY»bwÖ÷5šIp "Äk·€WNépÕš0¥¡¦ X&~ÕR›S6´q%±Ûƒ’§u>Ñ”Á`VÛdë ÀèÆ$[‡®Z¶àÚ:-Kð´†éÿoïÛv$¹®+¿ þ¡^xŠ>÷ËÌ“Ô– -„"FzÞ>‡&´lz;6š±qžÆQ•¡QŠ%¦,©bôK”3y…ðÉÎ7`ž;¨qyö]¤r*.𢮜5~>õ/Ôø(–¿-æçE…‡ènÉÅ\½) %PýðâìÙG™øJÄŽêÓ-È%4´ - ¡bZŠuDSÖߨ|¡ 5ÈOhÐåYz‹tãTÎô0«‘èðŽâX³SbP»µÌº”þú¢ËØÛ/pp’¯ãÏ ^ÂÑ¥÷Т2™c -Jì¼?Ôw•=¶µeo4R©–}l¡)Öä*¡ÔèçHŃŠÆÛ˜¹i».3½ýz³pªq½ âIÅ/May:ê¬,„¤OLÕØåU…iDäx%Ür̆{ÇóÉ4í -ŠŽ™„„â«QÈgÝ55zªìiÓeë
£©¼Øy%¾«½û‹×ŽèÅ -Q6¼è²x$ôb£XÇßÝ -hԛ么ìfI;x_Ed&|õ".ùeY/è‰(š’¢%zVh…UÊõ¡•3He/ sÔ)+W†éù6’(Á©$m˜¤õ=×Ø!©ên³v,cZïb¸R½¼[BÓªbÈfWT{Ó¤h¦Çæ©z*7DI!'÷ܦ-A¯¬óZÞˆ
·ÜŠÔNžwÈÁÚ£ÙûÙÂÇÕ‚v¦.œ£w:PŠ]ñ'«6®Ý”`*däEAZŸ€Äû•dÉšÑÌbŠœvbµÛßÆ°]Ŭ’¤ú°nOa\+Û@îšÐè¡än
¹ Õ‘4ê¤ó -^O¾€a8HÌDÎZ+‚ч¦anOðI,G¯†8ãÊû -å¹€ƒ5Œ°¦[’/MÉ4Ì¢.:]¬‡e?<ó²MŽ Z»–tÌF±v*’ªÑí"Ã%^+×é$…Ÿ±©ïÅf˲ÅÇuÎ!ÜN³Ý¦1 õïÑ,.±Öc¸Mœ®8`ït҄ઠBpÑh8þDª„g‘<1íÅ$ ´Wx«]‹>k3<-ŠÝXóJO2?I6”u6{H«Ÿ??ö³"¹/Á´VÐÈ^Êj6YÑîql´k×O×·œJ¥;·`pP€X2%;~¥ÉJo¦8ãÊ -ð21<²é»i-/V4Pöä1»Î
w¬dÀ]5»OõQàPUûÙ.ù¢°ùé´÷{;ãœgO˜ªÀÆ"N: -¾Ó]t”[xÒò@=š?׬Ý~S‘ön˜ž}d…
?’ນö5£t÷·á†zÂ'½îäøãõF5hå¯Ëvž¦]åôù×µ`mØ»‚¼È°$c§nä…4ê{&RX‡LŒQëol–ÞdÏž"™ÿO§ÝP—E~üÞú{ê³þ7ÝërÅ»Îæ]ãºö›+;søÞá~dŒP´Z‘{‚Š«´é·)T')Ô >úþ|ìýùÈûóqwb|jdĵB×dÉ1—‘ Ê=T@„ÉXÝ°~\$sÇJŽ‘|xÉ^+¤PènÖ˜É@a{!K½Z×_°üEÇÈ°³–x“ȶÊ{šÙÒ°AU -}3åp5Š8Ìóð«ú\‡›ÓÕœÂYðèQŸ"vº¾(K8±C€baB'>÷¯X‚ b’%| -Ìã
'|Iü)6@/ØéÀä}¸Tf(ï?é¢í›)"àÕc8†Ë´.¶‹¿¹×‹í·ÿè1_½g9|ÙþåîÚF\Ý®Ëm}uw}ûä1˜^Ý]Ý5h–Ç»p
èÃ,]ÐD}÷(Õì^`÷Ýa÷óÓ¢àÊ^ -ör\J.(јËĘ]¡h Å¿×7h(¦h; Rb —“6OGvÈI˜ -áx<ïÛ×'TÀ©í®,É•…;-pµ¤ -
•›ËsÓìd“k€’¬â"
h¯Òt¬-áœÄÑ4C%¸<hÚ‰¬ôõJ¨ËÖp¥ÂÑÔ+œDzƒáÌ.5‰é9RD™b¾žâUæü«r©F¾ìj®ªWã->€™£Þ1Ö—\'ø^xVeò7x’³@Jò]×|*ôðõó›ÅÎÙùh“’¯\S¤¦{¼¾l¦é¾=ëÉšŒY=öiN¹HQ‘}‘óxY‘¦ábË2d)M€æô=Ž(¨E›i%ÜQDŠö»°¾É ¼ØК\‘œÎi·1¯'a¹Ð,|k×˯~è*îÊ’\Y¸}«¸Þ–nA—5 -ªqìí¹dóšHâÇo"¿ÚíN`ž=àÕÂЀ*•ÐNÄ»9²Eß„A î2¾“W ¢lÅÉTHQäø£Æ°eϱ\“Ó8Y¨9o‘Æ[F
îSî2‡~aŒ¢Þ09°wFÃ#ˆˆ5Ö™EdWNÌåñT.ÿE[=±¾lÏe=\ ="‹0k.}·7Ì&–#@„*]J -|
HrUZjF“¿pî*«‚ï…3;<0Ž?elò«]VÙýa~nšaŽ5-:IƒÔž4ì͇”‡32Š\§_®fÿ:ÊŒ®)«F1¾Ú'ö‚ƒª&¸S®0ÏJFxºpÇ0‚Ißí>÷Üù“tŠMfä°^íÆYƒÏ"žëAcÑx²Uð<·£k˜°)·‰R|Îúo™ö‹³&HOûùÕe[xM£ÈËzj5|ÑnÄûyº0¹ü@åQ(¬(a¤ˆî
Eu˜·Âòˆ8ñ’·ŽÒ);ê¢àÀ»‘<¹œSZÚÎ÷Ú5b5uqr¦0y`$«<<Ó×ÕëPÞ8=ÛùÐé):<Q8[84*ø£äoˆ˜Õåp%•,âÝ›³4 -›åª¯jz&FB‹ÐD!„™!R'ËJÅJ _ˆ»äø¡Q4Tëòxq/7Wd^°þÄrø²Ý†8ôpÝ©òQ÷é“ôfo7qÝé…OµGÇÚ‹[[Zö—ý€¢—Ø…ëÍ×ÔSÑ*l.yè{b¸n
ÓüºÑÎR¤‰àl+H]"21ê1FÇ: B}ÊVÞ~³’Wùž¶×öZÓ«£MÕœrJÀUÌ»OÄ'æÕƒÙ–c=áÉÊ-ìYç7÷éEÃ…,bÖ«Œ#~¼¼—ÛKî°__
_´ñ•žÂcÛï`ÏökÌØÚ)4Åâ!$ü·ìæü´ùÛ8Â@Üq*ähÖDz]H|vÜ„ªÈ.L›æP71,WԄפIÌ¿´º·sê„+î÷°Î•S˜šÇ=– -C¤&‘QjØI OcÐŒý[+<…&D_j‘Õ8“Y?cˆä‡c6Ѳ¿ku¬ã稫-íyk³¼È¤?¹¶l7¢;=]x >âPGÃÃ(æÔm8fw@Ò£Oµy¨6£ÅBQˆê6ÍæW¢ÑíS˜ZœëRÎ,¨%ÌH·‹õÚŒ ù ì3ÞDÁ4q«§WBÉÒëì!”‘Ä= -Ë[F÷3ÞL5Aoô+8ºâèp¥qÝÚ4Ë\øÐðsš]æ}=4Êyg¶2n¡½h)gŠ÷WV÷r{ÉDõ‚ö'—ÖíFl©'ÿšþŽv4_@¨qëD{oš²Šå*z5´NÅŽæ,ž -‹ß€‡ñïAfY1À½Í覓išŽ8TØú1‰P—¡ŽoÇrª2QÛ²õ-Pcsi±OŒ0†¾Ë*àçÆU±¶kè]ì4ãI®þÀÜÜkí÷®—U2Æ"Ýa3ƒ9ïÙÀžµj¥Óš¾º—ÛË& ´?¹¶l·àZ=]•½¤õɼBôD1’d£›¨{nêµ
NÈn1›è#Óm*<Ís–ýÈQ$½Éí‰8v°4t{Y™ŠìÄÄ¢Xø‹$²Ö‡øš@#NUxÚ^¹ÚŒ_÷Áf’X†÷¦‰¾th{Õ1“ª€:»€ õ‚òU`}7dȨMw)eC{W¨æ¾Ï|všJWør{Ūô‚ö§–Öí/fj=yc½›×J3?Ô`Òn6f˜$x:%rú -‰!=ŒeµÓˆÞtzÏÆZ+âsÇ(hB¨J½ÁòÁ‚íUOCø¨¡§=7 ŽÓœìÍÀXÈCß3«y~\XDšåþ -fnCb{þ)ÌLt,:ʨp„ÅÙ¥GXŠ‘É -ÜR-«9¤*—ºãdßbŒ©Ø:lšw¨Œr¨éŸ=ñqª˜<?êw¯Úï©”N„K]‰âÒ܆ ÁPíµ!£±‰Í†Ai ã”Ô ¬ŠÃŽQ< -¢“Ao1£®ˆÁ¶n/–䙻ƳÎ<0™«¸9ÞšQl®¡ú0£àÿÇöDãd¤áÈÚ"˜S¥?S.OÇ\¥QÛ{¤™FŸÖäµ³Æ}÷xyoÄyË’ó!1¹ ¹Ô˜èGÔ»R³§ªIcPК¢&!–l,ª<c²ùˆæ7Ô±”¾à›Qöèy˜N¾k`ü‰2cXœ®FW,Ö÷¿i}’Þ—ü¼T8 -w†=d
K¹öŠÕîxETkvÚÌäÄ5ËËH_œ-„ÛÛ -Ì]m–W%3Z¯$ÒŽA²·½4ijÙÒAQ];+AµÕæõMòq·˜»üùÒ(äj^+õ›”0ìê¨udöKŒ’pÛìðØ’'•§Uñݪ®L™ÜTD½ªØѾc²_ ¦°”ËF¤zÓùQ/ªÑ¬óBž -‹Ùâ(s·«ukt?oÖèÅÅÒPT@m`y²ªyÓ¸Ftî\k¡®÷†Äñê‰0çLGë:2wœ{Î]
kÞ£¨§cl tdV
Áð—©ï¬Oqú—)“R¢>Ç)de3‘µ˜×ä6LØ,Œ€G[ì‹;{õ™Æµ3-2ΫJ{B»Xk†rÞò9®5úVú)7€¸FŒ²äó"—Q¬ êŽ,qÁ ìÊQª¬[±ÂØyU|œì6”ÊÜ%Ž8zeD›/§ØàÒ±ò¢Ú.ÁÉ€Ã{Ç+ÊÚ]Ó¤Æ}l 3KÄm“j0|¡õ3Xà¡©Ä"š™Özå©nõüD,„S
Ï^vUŒVŸëÖÕ¾<¶9¼Ê}ûÍC -§5…Ïj·¾ö™6
ô…Zù{¥VV4P!B‘+ïzŒ-® -A¬ÏGð‹=~RpV“ï˜Ie> ;m'Ýêƒ0òÚÉ by:³ÍæTFXð”gûg8G0’Ï¡·YO¢¶Wh,!|(μV˜ -Xd¢Ã<ý¢‹,Œ©ÐæúÜ~ó:‹Ë‡$g÷?†/8|ŸÁß« -ÔpurÔü¬ƒÈïþÕÝQXllÙºVŠ—7/Á+3Ks;~¦ÛʬË,Éá×\¶ß”_hÝøÅýzç -Ø2ýËÝÕ5¿²1éÊ=]Ùæ+`8CæÕÝu`]…ßãU¿çKÌ_bæ‚w÷»ñ½ -ÒKôÕ@×X½¡ óç -¶1 †å¨‘øAü-kýkMžuÆHÔãTÐ#hQ$¦D=C¨Þ6Ï4D£9Ó⯘•–ƒæÿ*/ -Ø:ÝŒÕm¿nÊqYBld4}mÛÔƒ^¤5»Ï9§2pÌ&q¥!¹¦RdÉ&ÑPÓDOÕ5r‘úe$UÂ? -V¨B¶Rós‚)d¦ênŽ´“—“§Þ'[è묘KûBsòA[µRž†¦i¢ùâ7î:àüd,ŒøeQ&Œa¯ø\
éþñª]îYíGíÅ -Ø:ÝŒ m¿n‡HãJÉA„b-ŠJq“X¢(íq„2Æ0½4ìÅI›W.^´bÄ4»Tá"%Oè639]uóMN{5
0 -ðt°½@fÆäÆ9q“<ËÀH=Zó|C·/Í‹Yå”UÚ»v?ðÛ[ÏnŒrÿx}/vבóáâûrlnCÁ¶_”äeîMiÊãU/ÝÖ< -™K\ÏÚ7vXJ˜ìÙÆ°¨[J)¹9må”â².šúAÂ(I4Ö½« W¦ŠLl±§Ý.iCHfÉ´Ù¬â
ªÁŒdã'ÞQhiª›=ÎŒz¯˜gñtw² -Ufï¥P˜‹°ŸK_•¤ ª»Ðfå ‡ŠVÆÞÕ ½Ë^o<ÍéÌæÞ>¨qJ‰“1üñÒ^li|Ø ¾\[§›1í¡øˆ.5WÚ#k›BqOiCªÞµlo¡HDÆ®î[7FöSÑͬàHFßCsÕ[ƒ°]JYAºÚ†gŠ¦öÜ^íË´¡ìí½’…çèf-°À×Ì÷HœÁBIÚ;ø2PN(1“Fy&¡—6Ín,F¯Þ¡1‘67£à ‘¦¶ž‡Ëµ½ØÙí -kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ùc1ª!Ûl[æŹknf—ÔëÓRH´8t"J]°RFŽÎ¥Äs¨;°‡…H¶—?—ÕqK;;úÕZ³‰ÐK?Ø@öÌÑB$9s‹ëª}š HdûÔ)LO
¶cl„$:‡äBï²è„šM÷qµÍÔHÝdS%ÖÒÆ•œW÷bggK8¶/W@Ët+δcþÆÚM¡ Gk¶G'C;dä6%¾Bx¡´™îºÙ'Ã,Ð$ªMš,‡Nä2L³ÓÓnJÞE›—ÔqÆC1û"3Xiž6™1¥[=Êèv±>Š%Òûn±ÿZ‡bUŸ‰ÍA¶3A.~hÚ!ÆPØ™eóÕàÀ˜&VD¬Rœ@ÌJØò~&ˆÀnÓ÷vS&™å>O»mûrÂDöàÿ‡z(-€ÒÍÈÕ>.êüTTí|eë=m&EdÃä>í·MªY´Ñt4;¤ùf(͉°/ˆŸv@(Fvxz):<{‘s/ÍÝCÿMð©TŠíû½+iñÖ4h—¦ƒ²úÝqo Øà£m)Tî|UxõGÍAV†"=˜žc±8¼ò™o>Ë—Z#5¨´Ì®¹,Ï€ìtò¾c=Á\¢.rÄx±[1±í?ÄÉËV fb–ä6xgòî⊠–dæT[^¬Ùpʼ>áfå„€‘¥ÿ¶c՜€·™±Y' ÓÅW=yæ\I¤ž|+ÄD˹hpK¶É=ñ«Uf‘‡O†%yx -Ûl¨%ÉV9L
Ø–$<)ì®Ùž¤£ëÄi–G»ÌobTüƒ(òäöU§Fœ"™«Èæsƒéë‰É1ÀŽ*KT÷¼XÍÔö#™°¤q ¶9~,øk¥_X/ÊH׿ëÁ[3“k”xR€A2¯GEf›ŸrçA¦Õ žÚà#œõîæô<ê/_Ì``lܪ[F‹Îõƒiø#åöÁjJñf¼7J”ðk3šhÏ÷¡Œá£k¨š¡I˜†éòjÔYûbŠ©´Ê Ž - -‰¸#Š -â¬*,âk}¥Ñ”{Àû ïéá9\¨sD¼ÀŸIQ´Ï›¬‹´Útõf‡°3ÌCÏ`¶S|‚€ù«§[y•Zõ<å“ÝþiGªš©‰Óô®|‚JàJi£ÿ®ˆ&ìj\¨ÞŽÓÌFõD~P¶…fkñÞö³,ÙXûjkVOhl`¨a
-ìZ£Pœ:¸ÝìgÃÑ˘àê0²U$¯!Ÿ`5Õäìg·ù‘ɹí ï:Ï¡æU{ØÌ“,¦Î«v+'Г»zDÞôC0k·Î¸VÐŒï™?ºƒïuãS쩈OL6·vôê´PÌŒÎc„²g€—ÕõH):Ž%û»-±x¼´êöÙ7sYŸó±ç¥ø¸>·ÝâV1þ…£¾Xع® -œ
¹bc˜£õ^f·Ò©ï-ñž“·7®®Í¼¬¦¡æ{¶ÐÚ¦Bmº‘‘K§xÊÄt#c+–fu[´5Í©˜jaÁ}ôÏy
gV3=üªÙDûj³N’fÒ+T¤ßi€úç¬8²d/Ì=,îع¬åGVc(‹¨BJ‘ +Ç`) •ø!|‹gíõM +~erÓ´)œ,±£ógíÇÚCSh„B¿ÓÕ¢ºkZlÚU¤úø~ªSÖVH°ýqe´`
EJ§Ö5¤Øû̯
ñþ± +
9ìW„½)7y]þE{32]˜ÃžÿÍ+ÌëîÏ{nÞ-¼„.äk¡ùrR™64O`Æ<¨ Ç a^zù¼#©AUfŒƒÑpL/å¸ôE1sIöJ„)ËT)KhyñÐVð-B†ÒÈ'è%±fðø¦†ºáRM‹˜4FÖ0cð®‡2øDÕ“vf) +ÞTVûw&§’©dV¦Ã„ÎT5©ƒ,¾©á.š›ÇŽ} ƒÉ¾‘,wa5[ɑׅí欃SõJV*6‰]=L 2£ì±ëzMYž*Â’°ÞMß;,Cɘ¦jR“ÂQܸÃÏTeÆ +)¨ÐjÜÜä7$/¶åù11Àk>´p5ƒJMQUåµÑš1J\6Xz%VôžˆÒÙ’{±æ›qÎQ +n¿?j¿?fÿ/ø?Í +ßDd“ÿ¤žÀòŸ%k⬷üòÍM„U…ÓzBÌw/¹²êQýtûʯ´€ë97ÉímÙþEëA©^ÞäËïzÑ@gäå^¼¶_/~«{;}ùæd/1X^,ì+h~‰ø3|~yÞê/f*yí7ˆ} ÓàyPØ…%!õ?$Ñ‚ k"8Y±5„BĪöó_ËžXx¥RÚå3ä†8ýâçÜ„çÛ„çï½ Ïß{®+p÷Â/Wä¼j!fËÁD¾‘,J:Û%+<ÑdIõ×X¢j‘Þ¹¡Ú‹’á®aV½ê3ú¥úðK‘ËôÊ8c/ߧÈ
F„„á” @%‰Øpšë.)«ÉÈÿñ/r`v-¦„¢G•H6¤DMYÃMâè#üÊPšI}Ã÷øþæ$ÊXßxÑ¿ÿ¾úìùƒôÙó‡é³çï¡Ïž¿ëE½¢Û•U+K‡ +qËMiÞÄÔ”á+¾‰:‚ +sy}¥^¬õl”mqCÆ2{ª¢(³bh¢xÛÜ
+c%Hg’VˆÚ°åe’“
W…9…¹µ=½X‘ëV¶uû$0w÷¢^ŒÇPžžÊyÙßÚz€=JUL€¬Éæ «?®üdûtxc êK}kFߦ}„a‰²Hû@j‚ÂÈl¥wéW*:bµkdaØó‚8‡·ëÊ·Âj8 Z}hóþ¢0wh‹f7ÎËŸ¨/C6r7VÉ DA6R3²]ܶNµ”úRŠO/Öñºƒš_ø @õîE½"7;=¶e+ÈíšGs<C2,9ì€d×<h‡«'·ÃþÅÜQùNÓM™PD}ªÆïaûÉ.°®ë2_m ÊxH×°zWkä2Â6‘#í_to7“&FWI0¯e´£®ÝIpc»”²>#8ÿ„N1PÀ°E;Å|´[ÚžôÇ3^pÝŒËRÞíâ¼|æ#†ë|m1Bdvzè@‰ôò§@ÇZ:yJÍÊIr*ßl`¶n6é¦É ÜsVm0 3äáUôŠu¸| Ö©ªMR1wØG¡+]O´ªL»/#!œ²u*XV$BÔ)üŠz +Œ(‹ÀÚ¦ãªdeÿÔçÌ® +7©hâ\s&dCµäuí%HÏëñ#×M4º>~´Þ½¨ã!Äe§HÚH¥$lŠÏhE--%âDx"»
cl.'‚ÅšÃ~¦iƒ¢L³8¬‘–%Àq²Dphâ‹*É–€(èÞµs5Ím +ÈêtŽ EéÖ›\žThÆû×^m8Œ¨H¸Êý§nå–'ÔÌmTŽË¡cN
;e#Ò–l»(ÓšözÞÇÞ/y‹°w/êÅxOÙé±,x·å¬o|Ï5…u¥r‹LW¦žåu=¾cƧ4.”/õfë¶"dõ(,-G«réòÑs±Zæ`tÚ®æ^ÜÕ‡ÿuœ§à8mšŠ$ðÒwd³½V'U‰Æ‘ˆ—ÆìŠ(•<…WR½òÞe…—Ç 7†X”õJJc|ªqn×ýZ^·qÔþiàõîE½"&;=¶€*×*–܇sÊ‹a9%)H™±I^nrXbÇqNB]à³8ºÌ6€³f!¸MÕo
Ëpòkغ¾ÇŒƒ¬×º‚Фs +ɳÏþ?DET´:ÎLÚ;õʵ<obY&öÇŽÖ/êÅxéØé¡œ#·Ð:½3œÌ/q_èg1¿*ʶ_SȾþšµ[k™¡·Ck ª…ج]Ù;O@?iZEßåÚòÊ)Ý‚µV¥ô֔˄¯IÓmÊkÍgU8³<=þl¬U6“€YYokÖÁ8€©Ò¤Y‡>ÅÞ—+yÝÂ˧ջõb<ˆ^ì’OHÃh=~±KH±Útµ_¬‚†&¶kÛe 0êÏ·Sø¼µÑΈŒ»®ºoºma,ÝÊáN´ ¢1Íœ8ݶ¢Yëdö´ê{ƒÁQ„†-Nl¥ÖÉE_´Ò¸uédºò´y›‡ 0‚F£B¸G¦mˆ\Ò⺫bÈClfŒk3|£¤HÒ4Hª˜V +,)8$ s˜T,q@)¯ðØXbþ«2ü Ú fˆ9šR¹Ô°¢ +êXتBÛ,·pkPñ‹5œ®‡]Ø4]hR})»œÔáÙe°cÐù+ª>Õ cT*4ºLÔ
äÄÐU +…¡ ‰’’?kÊ7ƒ†!od‰šlÙ1YÜŸ¹úíÓdæ:×VC Á˜=^ñG†‚f¼c !¡øjòY|Jžê +÷´¹dœR£©\ì|ïã껿¬]¬ec^– +½Ûhóþ̨hX/Se†!t=ª;Nõ]¨ó¢FXFJ;9cE\+¼ˆ¦ü–²¬ëz"ª¦DéK‰^‹E[a7G}hg†ÃašS„US!_9¨#Sú¯k¹:’(!Áˆ©$mXÒÇþž‚mì¶S½·mç¯ÀP^+u|Ë<@ä`ºd!†l+£úÞIцŠ‰Þ
Q&SÈi9rs™0AØu-DÖƒŸÜŠ”PžšÞÈ1á£ù¶v4¹:ˆgÝuç+}§?¥PFƒrrýqíV}ä§AèÅl×,'þ^ùDNÝŒfŸˆisZÕ?ÿ8&ûŠm”¤¢ˆO!^ü//^Û11‰vèÓ™ÞAð¶-¥åõµS˜a<é«k-gd‘"¯ëdÄÆɪiØ%ª:¤È# wWœqç„…ùÜçàþÖ|K²£©)¹ÃÖvÑYc½,»°™³mrMÐJ¶¤C7Š»¯ÈG—ŒtL”¬bʸÏ*Ée¤M}/6¿.ë_.Ôƒ’ð{š7Ÿ–‚6 G›#\c-ÈXszÅ;ûNN€®"@M¾ãŸèA¥ò¬¢'ÄW½ ø}¿·Úµê³6+ìé e(þamÕ‚’§J²¡T}¨³ù%]`}íQ_r›‚UZÐxbÊj¶¬h39Hª·kÃçRƾ¥÷pà8(˜¬¾š’œ¥æJoÖªq§xD™CÙÊpºCÆõå–gf{³aÈ¢üªæß©¶œ±êï‘Æ“·ˆGÅÓ5èí +{I¾1P«Š+Vç;duZVW<nº¢Õ·sYÏÇ^q¹·˜Vêô8â–E…\‹ƒN3^Ê»í5~§g¹0ïP¦“F=Úõknå>®k_se*Y’Ã…$ðŽ–üµ8Üruùõ¡µz‡ûúº?´^¯7jE—Ën3{ZÙÊ?\_ׂµá‹„,|ÈðíÉ8ë‹òGæ»Úþs'ùZ‡²“ü3£¸”ýê‰Îjÿ¸òŒY¶w.5óÿ“^ê†JÁïü½ýï©Ï®‰å fað\ÿÍ}¦Nß;ýÞŸ +]ý$DßÁXÅ×íce¬êÌXuÁæŽÌ?—8*ÿpL^è¨9Ÿ]1œ`]2’NTE“Gj2Ü;ÜÖ‚€±¬dÛÞ²¯MTH¢›Ý24ßÉR¯n
."©èS‚c¾&Z°Dx¾•*8•TjƒŠöq°]´–7YÃ8]£t_Õ8«ÝµÖn[³æ󧲊iq& ’l#¨(!¦•‰©¡Î-úê,Ê*hû꼯ɼ?W6ªý”¡¢ßo¯²4²n=N}P—|UI3ùOÕd¼*–˜@9¹õ.¤9au[”vdIdÅûCÅ%š:z>Ð]Zw‘dÓLïÍ![Úû«™»º•ýHºö‡šþt»kmçåŸZ‡ËúO; ˜b:Øûå+‹û.ª›ø«?{ó³ŸÿEýû?ÿÍ?~õ«ßýÛ·oõï?ûú×ÿüJÞ,-x?¦',ý±(bª~õoþÓÿ‡¡êÿê]—ÈßþåWý¿xú/Oû£ÿ•—vøûãÃǹ\Ô??þ÷·ÿqá„úÅc(¡î.òÿvüŸ9DÿñTžþòéÿŸðôøÓõæíñ5¨‘Ë–ÔXŒ—`…(Ë{ÎvO5·D{œyPœMÃÌ0ÊoNÕÐq”¬§?Zof~ +I¡ÈÛçRhÇ*§§QÄɶ§¿ªÏåqúqzÚâ(×+¼xÕ÷0KýàPÕë‹»…‘d„Ên"Œ½ÅçþKTå´…oAÝÆaƒÚØ’µÇ)Ù2ðñ +&yY<¹Õ;àx‚ã7¡©'Ï¢ )ž¯ü™ç_Ñç_Ñç^Ñç_Ñç7ß½$¯-ÜmD&°ÊfdYÁFÑqýhìKlsJ¤a5ï¥ÔéŽÎD“^u( ‡_§¤<f„ù£#Cy¾ëÀð=ÜCÓ¨ŠÎ©É`+?2‚®
"
(‡NÀ2"÷%ÿ‚.‘/T!žHQTÕZä(Å ñõªbÁ+i&ùˆ|Úø"Ã$áaRPiè|“ýß’I¾à—¾ìËDá7¯/•Äï?T>°.|þ`]øüÁºð}˱–íß“9<=¸éèXÅ°é†ØNдº1tÉße@Æ9ðå,$ThP¢‰ž‰2?áh`g}¯@ ‚SLÑû!v\`™CE/x˜5ä"L…à<ŸþcÅë;Â'©û^Y’Wî²ÀÕÓV!*7—§¨ùœ“Ÿ€’¬Z$
£¯Ò{,EáÈŸÄA;C%»<hò‰¬^”PÇÉQ…S©e8݈”cIÀ=o‰µÙ’ÀæË·¢`ž"øåp¯·ESͼ”^Uë(žÆŸø|¼œkƬá:Á´Æ{°ˆ“Óµ–œeÆQ¢†o¡å¯_ëA'©_yM!|’zïår¬esÕ³½^Í˜Õ aŸþ+)i-’9r1+Û Ò`ì~QÊ,… Ñל:Èq+µèq]!EÔ§ û›œ<ŒAWÔ+’Ë¡ío{–;5ýÞõS×w¯,É+w[à*®¸(dëe͵jœ¡DS/yøI +)‹Ü#G’Ю˨ßÂïÀ<¿Ìyf˜m£p'ìJ*žÑƒoxªÄ:³ +V9Š#`blí¨çëB‰r9²^®\Æžu~sq!óR8}‘EnÂz•¤yÊ/—÷~{Éêý쯯ÆZ´ÇП^âhǾa=û1qKd§Ð,ŠeE»’àßò2î§çŽã +¤Y +Îê®8:\i<·6
mW½>üœ6ËV‡mrÙ]ó-´-åLñé•Õ½ß^rZ}Fû;—ÃËöòÕ‹¯Í^€…u4j@¨©òÄzoŠ“½ëÃsΩÖÑäÅ3±Ž)÷Af™0@½‡ÓÃ4`£æ÷Í/X'}¬V;/Ã,œRä´hb2¶mè;hãyÍ4×'ƒGdë²D†ªû¹mUðË5»•Dío™©{Ý`ﺪ’¹xp‡g!sŽµ¡žµj¥]³Ÿkuï7—íCŸ±þÎåð²=„ºõòX6¥.¬OfâJ(#}6ºE}¥ç¦nmKvGlâïy÷4ÎÙ +i"‘ ÎÑ›Iw•tàœHÁï@T–8§Î¦F7ƒS± ìÛγsoÓº +^,îýÞ¦êg¨¿{9¼lᙽÜ$+Z‘u4{É/ŽÞÈg"jae¯À(N‘±ÃŒ3§5C˃œžN(Ó2ÝΡÎ)È£lò?àz¢êª”®e,¶:H”SøKiªE¡’_„ÿß2T%¥ÀË¢tº§ôJ¡Ùi͘q–áh +N®4çQ•Â?€¼kP ÝœÊ÷*6pÜé‚¢›aÇ#•|6ÿÓËŽß[’ß~†ú;—ÃËö’ÚËcû¸ÒQOóoµåƒ–€ˆÞDB~8(#P;Yo^f“j³kL´±îB†Šö¬ÈŒæ:Å,5£^«…æ`B]°ƒ€–
¡ÅÊDß57Ùéämd +ŠXW¦ÉÜN)»çqZP +v×,)›@Ž¯$ÓR +‘ÆT¼ÇϪ¬j +êPvÕaÇd +²åàªëþ/{ò ®Döá!}ÉÂ"rê-67`WªÎ +Ù1qÞ9a°ä‚…Ns5Uõ>³ñ9(ž~è¨ÌÛTîèbm¦%ÛŠ3¹À“ëCÃß*€î>qW¸"Î%À’ò¦’¥˜óÉÃý¡XÄ%Ù;[UȯÞPŽœj±ÛWdÍl#Œñ©¹r⨚úC9q¦ø›>ç.ÛîaiÔÐÝ…Rì‚ìªuqƒn¯š¤‰ÿ“– +—Qãg^¯OEi“
fí¸^Âë\jI½²¸\ÄnªÖ©@¥Ïð+×°5o¯XûŽÛ¤º7ê°¨W0.*Ýv6 Zý¹mä+&´»š4_•ÌèNK¾²Eò…G‡Nj\fwPØ''¨»Õ¼¿Iîo¢Ñ7o|f£p¬I±T~ÒÐ0Á£V•‰v,8JȽHâ!&í*Ï®bÁU=²Î©¥zUq¤¿cr6°k3¥½‘4©«}Ž¨[l4÷mŽàÞw +‹ÍöúzZwÏüu³De.‡¢bêo³EåVDV}ð6â2ö®¥´‹½7|vŠmO„Dg:; +И¹Ë6½QäÜeû°üáYE_á/@¶à Fʬ̳>ÅÁcV-$ÝRStkîH®°‰¬Þ|¹&âÙf|AÚmPhß¾±a0dF×ZlxdX•…v·Øû¼7<t^lô¹ôK"1eõçM[£¸ ¬EÔ(9ËÁðÊhª{¬»0 +1KC./öŠfnfVœ=8ÂÍšsM÷àÒ±V¢ÚîÑÉàÄ{ƒç+ÊñžÝؤ¾l O3kʽI5`h
R4•cD«éŽÕWÞê1ÜÍp¢âÕ#¯ŠçêsÝMñÛ»›c•ÅŸ£ñHátOù¬þéhï‘éQ¤TªæÛøÌÉö™“ííÈÉö™ø¬ÄB±UÔÏ7 ±Øâ6»qƒd³:ƒ˜3Îÿ.^p±O_Ù"9;-¥§Ìzþ+Ó|з_Áÿ¾æ~Àå]~*´Ð,@€Ò|-ô†îÇÉ]‚ú_}V蟿¹î÷†í÷í÷†ì÷ìïÀMÆèïO’Mo£vÑl0íÌ-!*{ÛtgF Ý*ǴŘ™Y"É"sû^VMyá9Ï"04·•½[BøLc:©>ÚÈ®wÙ®ˆ°hWÔ0D¶?·_a=ì囂m›LÍ¬à›°7|2Îs¦]>9>úEÍ"Ìc êg³äí3¢É@ÒÛ¬Q»m!œzŽ|WPiN„yù‹Kä »ñûs·"`¹I²ÿõ‰ùŽ}ø‡2+š™@ =È¢f§¥vRG£.Ý¥ˆ_IšL\Í ðâáx*xïRŒ‡Òq÷ÃH'ÞÄKqú“÷ʶ¾deS`$N¢¹=‹åw2i Øù§áayœÿõ%ßÃ$üCXË^YM‹rT-ÇI’ù¡¿[µ´EŠCrysÔ(º“h½þ—oÎÂâ €ûY)Þ¿½_ÚÍÊíü™î¥ÝÙ’Ó_[²ÛZÚ?üîå¾üÎð2ýÍ›W7í•M¯ü¦Wpò +š®˜ûòÍëÈ|¿/WýõóphîA÷Ë3@¦ú™B2'MMÆ’hr|ÓÜL#Q#Þ(ª}Ÿ›”«žWÒÞ +¬uzWÝí¹ä¥–848MPÝŒ.ÝÒÜš{fH´ù°!,M'¾Zf5œ»_†3yªú¢´¸«LnœQ‚ó¸®xòtñÔ¶µ7I´'<îJWBëpÐa_ìÚĪí)#nøͤc4Ž[¼p²Ò4’'íÐ}YŸŠn© +Ó¢Ž…Šû"4äFƒ šÌÇ`“y®æ$+:ä°zk½»êìùͱ氱•vÊò¯šˆ8‰&SyEj$½þjBVŠ'9+•f–NaE1ÿjAô'”¤+›Ý%+~M2@kçe £ˆa¢¯Íû4ñ‹Xëô0†¼Ûs9ÍÅǸÄთ|(Hwh0³¢£w–WA»ö!4ý˪eˆ*ãŸ*ÅÍk˜‘ ’k'ú®×EûX§±XšQÈÁáÌsW,'@ϵšÌae¡‘Ä»Þ"S¶X¾â*%)¸[¡»ýAÆâÓFèÝ +¬uzÝúCAL@ œƒ5™;”¬Ch«6)ýªÇ
—¶EY†ŒÅ•Â£ŠÀ˜Æ°X"µTÓè©¥BûÔóreéË!¥]Ÿš,M +·Ü_ݦ S]ŒD<Íu:§I 9l6<7 ´Sç\Ž`MÊE9z…î¶'…Ø?m€Þ¯€×éQ\t·Ç¦·!ÄÞK«kïRºGk^V=‡·Ê¾±EL¶M¹¦Rd×&%=h°§ºr‘öe0MÂ]<CŠU{=Áú˜ +eŒaµ4|oÒä•Ã]/™f—&ÜÄê ýqV™sin^ä4WÓpÈ€1P"9¯ÞÒ(û™¶E
m¹ÀE"²aÈ6ÉæF²Ï€šO›×uWÏí—¢ª +Æ6‹õ)JuÿìѪÃi;‰œ]dÌ…PŽs„’].C³dŽ›ÁJQ[Þd/yÕ÷´Ù¬¦Wwj +i#x¬B#]zú°7V]œ‚;½ëU£3cZ–9Q{<˺H=ºÛ¿¡;™¶Å¬§Ï*Ý]û:îÇç…£<½\ß»½]¸ùtÑ}¿^§ÇÝžJʵ…î‚4(‚шª;·µ’Ì%ngo;B%L~¹1‚K)¥eL;ºœRÜÆE“;?Hp%‰FÕwÕËR‘2ût3KÚ”Y÷Ç?Ú<g—DB7'ð¨ö´æfS6ceÕô³€Iª;9¼s”–#lÕ]d†0xã¿PRÍSÓÝÛÁâio«[K>]t߯€×éa<q·çÎ26¾Ó\žz6/ZFk\ö=»}Û¶50§–Ñ +É;rQWH4Ʊ4p‘>Ï·á~¥4‡æó²_Fž²_8í‚ +í$rwp`*¾W5yÆzU@fǨ°˜‹N@.}g¼Éx@lw´X½Tt}}W[7v0¯ÒçiÇ3ÛÅ}+¾)]N®ó—K{·±¤?û¤¡}¿^§‡ñÃÝ¢ó½uKu¬m +e¹KRuå²
‡"»zÛº1ò:ÝÖ‡™0ÚRÀ5Û¥”¨«m¬äÑô± ÑÁ½êŽ™I”Ñ}«hà9ºY•,ð5›á«æŽÓc(I·%^ Je!fÒ2ÇKÀmo,F¯«ud‚ÇÚºG%M;ífŒûµ½ÛÙã +$<)ìK²MEyÆ¥§MÎ^^Ö2¿‰}PbÉ“ÛW2âɾ"ûà
?’î“%.Ä +Š,O<¾ÅÄÀ-M¾8ǵ‡mõq òo0ËYD?öÖc°E¾¾pº»>´¦*ÒÞA£ œ +
˜yËm+ÍÀa~Ùr'GS(±¹3¾àãTˆh€ã¬ª.âµ¾ÓhÊ=à>è·$ñáÎY¨:sļÀúIQtŒçMÖEÚ횺Ù!¬Áf‚]ô.dŸâ̤4£âƒ‡å¡ÒÕC%–°ˆÆTˆz@êŽe
µ3‡ÎÔäl:[k +ªâJ9é)†¯ˆ'lIu5C[¬+¹”{¡[Vó;MY¨¿ÚšKÍX8ÙóáBDÐ¥.úeˆj)‹DͬÌéaU«Žjʺ&Æú«®o*US†¤ÓªR Õ¢¸3–$’}³Í±ì"W·\òa,GCF²ql<Í·ýŠ1(K·(–»°}·÷xx§èÌTÉñ)<3V]QV1§B©Åˆqm¯1i(}Õ×$Ž³(J%éi‡²¿šs6WŠÙRu¨ÄYúb1|’ Ìžmûž½mƒ-¿´â‹Ø>¨añ”}œ>’âÞ36î0kÜ#s0À[6pSsÜñØ]!íÒÿ¼Xxjró«þ,ÊÅ¢¾›Ü(ó~n^
jca™ÃÝä5%7#ß`7Ýä¼Nr[(çV–èù®ÓjÞʼnÍ^f±V¸®ÚÃئÀ¸¾t'ÂônÜÁ¦pq/¡-ó¸?ûŠïõ(ä§aOˆŸà§ómW[(¶±ó¸ÅIÙTÀLJºÔJ):%¯^†ÆæÓ²û%[ó7sÙŸ[£®Kñ0úÒcó¸s̸»Aqˆºîbœ
dÑÍÛÑ›yô¼œ£Ïi5GîžÏ¼“”,¿¡Z®·Ì¢»¦Ârú!#»©§¬ž–æð‡ŒMYš½L—Cÿcªv†¤+ÏãyêOsÍXXâWm>ÝÖž••´¨ÆØÙ¢"åO[u}Îå”%¯BÞÓâ>ŠRÌB20CÙtÒ¸øbî¡úrhñ®6.ì{ÝÓ± eàÉÝ!'£?×vq¤µ•â
Ñr
®òQ}XzåE'ößúÝNÙzߨ±â—÷݆>ã×dëQ~_òJ¸Š¼Ô»L·áEMG®²ãþ¨„cËTþÌàð™Ááú’Ÿ‰ÅL,6§Ò‚šZlËŠ†ÓÅ,} +ì)Á[uŸë×Ì4n¢å̵4/Ÿƒ&ªœni–‹HÓß´Œq}ÊM¼SãRÎÓ¢]iho}n¿ 0000000016 00000 n
-0000045544 00000 n
+0000046044 00000 n
0000000004 00000 f
0000000006 00000 f
-0000055744 00000 n
+0000046095 00000 n
0000000007 00000 f
0000000008 00000 f
0000000009 00000 f
@@ -4977,9 +4996,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000013 00000 f
0000000014 00000 f
0000000018 00000 f
-0000045595 00000 n
-0000055567 00000 n
-0000055598 00000 n
+0000359516 00000 n
+0000372837 00000 n
+0000372868 00000 n
0000000019 00000 f
0000000020 00000 f
0000000021 00000 f
@@ -4989,9 +5008,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000025 00000 f
0000000026 00000 f
0000000030 00000 f
-0000045664 00000 n
-0000055451 00000 n
-0000055482 00000 n
+0000359585 00000 n
+0000372721 00000 n
+0000372752 00000 n
0000000031 00000 f
0000000032 00000 f
0000000033 00000 f
@@ -4999,9 +5018,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000035 00000 f
0000000036 00000 f
0000000040 00000 f
-0000045735 00000 n
-0000055335 00000 n
-0000055366 00000 n
+0000359656 00000 n
+0000372605 00000 n
+0000372636 00000 n
0000000041 00000 f
0000000042 00000 f
0000000043 00000 f
@@ -5027,9 +5046,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000063 00000 f
0000000064 00000 f
0000000068 00000 f
-0000045805 00000 n
-0000055219 00000 n
-0000055250 00000 n
+0000359726 00000 n
+0000372489 00000 n
+0000372520 00000 n
0000000069 00000 f
0000000070 00000 f
0000000071 00000 f
@@ -5040,9 +5059,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000076 00000 f
0000000077 00000 f
0000000081 00000 f
-0000045874 00000 n
-0000055103 00000 n
-0000055134 00000 n
+0000359795 00000 n
+0000372373 00000 n
+0000372404 00000 n
0000000082 00000 f
0000000083 00000 f
0000000084 00000 f
@@ -5052,9 +5071,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000088 00000 f
0000000089 00000 f
0000000093 00000 f
-0000045945 00000 n
-0000054987 00000 n
-0000055018 00000 n
+0000359866 00000 n
+0000372257 00000 n
+0000372288 00000 n
0000000094 00000 f
0000000095 00000 f
0000000096 00000 f
@@ -5078,9 +5097,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000114 00000 f
0000000115 00000 f
0000000119 00000 f
-0000046015 00000 n
-0000054869 00000 n
-0000054901 00000 n
+0000359936 00000 n
+0000372139 00000 n
+0000372171 00000 n
0000000120 00000 f
0000000121 00000 f
0000000122 00000 f
@@ -5091,9 +5110,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000127 00000 f
0000000128 00000 f
0000000132 00000 f
-0000046087 00000 n
-0000054751 00000 n
-0000054783 00000 n
+0000360008 00000 n
+0000372021 00000 n
+0000372053 00000 n
0000000133 00000 f
0000000134 00000 f
0000000135 00000 f
@@ -5103,9 +5122,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000139 00000 f
0000000140 00000 f
0000000144 00000 f
-0000046161 00000 n
-0000054633 00000 n
-0000054665 00000 n
+0000360082 00000 n
+0000371903 00000 n
+0000371935 00000 n
0000000145 00000 f
0000000146 00000 f
0000000147 00000 f
@@ -5129,9 +5148,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000165 00000 f
0000000166 00000 f
0000000170 00000 f
-0000046234 00000 n
-0000054515 00000 n
-0000054547 00000 n
+0000360155 00000 n
+0000371785 00000 n
+0000371817 00000 n
0000000171 00000 f
0000000172 00000 f
0000000173 00000 f
@@ -5142,9 +5161,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000178 00000 f
0000000179 00000 f
0000000183 00000 f
-0000046306 00000 n
-0000054397 00000 n
-0000054429 00000 n
+0000360227 00000 n
+0000371667 00000 n
+0000371699 00000 n
0000000184 00000 f
0000000185 00000 f
0000000186 00000 f
@@ -5154,9 +5173,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000190 00000 f
0000000191 00000 f
0000000195 00000 f
-0000046380 00000 n
-0000054279 00000 n
-0000054311 00000 n
+0000360301 00000 n
+0000371549 00000 n
+0000371581 00000 n
0000000196 00000 f
0000000197 00000 f
0000000198 00000 f
@@ -5180,9 +5199,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000216 00000 f
0000000217 00000 f
0000000221 00000 f
-0000046453 00000 n
-0000054161 00000 n
-0000054193 00000 n
+0000360374 00000 n
+0000371431 00000 n
+0000371463 00000 n
0000000222 00000 f
0000000223 00000 f
0000000224 00000 f
@@ -5199,9 +5218,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000235 00000 f
0000000236 00000 f
0000000240 00000 f
-0000046525 00000 n
-0000054043 00000 n
-0000054075 00000 n
+0000360446 00000 n
+0000371313 00000 n
+0000371345 00000 n
0000000241 00000 f
0000000242 00000 f
0000000243 00000 f
@@ -5217,9 +5236,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000253 00000 f
0000000254 00000 f
0000000258 00000 f
-0000046599 00000 n
-0000053925 00000 n
-0000053957 00000 n
+0000360520 00000 n
+0000371195 00000 n
+0000371227 00000 n
0000000259 00000 f
0000000260 00000 f
0000000261 00000 f
@@ -5249,9 +5268,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000285 00000 f
0000000286 00000 f
0000000290 00000 f
-0000046672 00000 n
-0000053807 00000 n
-0000053839 00000 n
+0000360593 00000 n
+0000371077 00000 n
+0000371109 00000 n
0000000291 00000 f
0000000292 00000 f
0000000293 00000 f
@@ -5268,9 +5287,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000304 00000 f
0000000305 00000 f
0000000309 00000 f
-0000046744 00000 n
-0000053689 00000 n
-0000053721 00000 n
+0000360665 00000 n
+0000370959 00000 n
+0000370991 00000 n
0000000310 00000 f
0000000311 00000 f
0000000312 00000 f
@@ -5286,9 +5305,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000322 00000 f
0000000323 00000 f
0000000327 00000 f
-0000046818 00000 n
-0000053571 00000 n
-0000053603 00000 n
+0000360739 00000 n
+0000370841 00000 n
+0000370873 00000 n
0000000328 00000 f
0000000329 00000 f
0000000330 00000 f
@@ -5318,9 +5337,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000354 00000 f
0000000355 00000 f
0000000359 00000 f
-0000046891 00000 n
-0000053453 00000 n
-0000053485 00000 n
+0000360812 00000 n
+0000370723 00000 n
+0000370755 00000 n
0000000360 00000 f
0000000361 00000 f
0000000362 00000 f
@@ -5337,9 +5356,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000373 00000 f
0000000374 00000 f
0000000378 00000 f
-0000046963 00000 n
-0000053335 00000 n
-0000053367 00000 n
+0000360884 00000 n
+0000370605 00000 n
+0000370637 00000 n
0000000379 00000 f
0000000380 00000 f
0000000381 00000 f
@@ -5355,9 +5374,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000391 00000 f
0000000392 00000 f
0000000396 00000 f
-0000047037 00000 n
-0000053217 00000 n
-0000053249 00000 n
+0000360958 00000 n
+0000370487 00000 n
+0000370519 00000 n
0000000397 00000 f
0000000398 00000 f
0000000399 00000 f
@@ -5387,9 +5406,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000423 00000 f
0000000424 00000 f
0000000428 00000 f
-0000047110 00000 n
-0000053099 00000 n
-0000053131 00000 n
+0000361031 00000 n
+0000370369 00000 n
+0000370401 00000 n
0000000429 00000 f
0000000430 00000 f
0000000431 00000 f
@@ -5406,9 +5425,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000442 00000 f
0000000443 00000 f
0000000447 00000 f
-0000047182 00000 n
-0000052981 00000 n
-0000053013 00000 n
+0000361103 00000 n
+0000370251 00000 n
+0000370283 00000 n
0000000448 00000 f
0000000449 00000 f
0000000450 00000 f
@@ -5424,9 +5443,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000460 00000 f
0000000461 00000 f
0000000465 00000 f
-0000047254 00000 n
-0000052863 00000 n
-0000052895 00000 n
+0000361175 00000 n
+0000370133 00000 n
+0000370165 00000 n
0000000466 00000 f
0000000467 00000 f
0000000468 00000 f
@@ -5442,9 +5461,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000478 00000 f
0000000479 00000 f
0000000483 00000 f
-0000047328 00000 n
-0000052745 00000 n
-0000052777 00000 n
+0000361249 00000 n
+0000370015 00000 n
+0000370047 00000 n
0000000484 00000 f
0000000485 00000 f
0000000486 00000 f
@@ -5477,9 +5496,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000513 00000 f
0000000514 00000 f
0000000518 00000 f
-0000047401 00000 n
-0000052627 00000 n
-0000052659 00000 n
+0000361322 00000 n
+0000369897 00000 n
+0000369929 00000 n
0000000519 00000 f
0000000520 00000 f
0000000521 00000 f
@@ -5496,9 +5515,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000532 00000 f
0000000533 00000 f
0000000537 00000 f
-0000047473 00000 n
-0000052509 00000 n
-0000052541 00000 n
+0000361394 00000 n
+0000369779 00000 n
+0000369811 00000 n
0000000538 00000 f
0000000539 00000 f
0000000540 00000 f
@@ -5514,9 +5533,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000550 00000 f
0000000551 00000 f
0000000555 00000 f
-0000047545 00000 n
-0000052391 00000 n
-0000052423 00000 n
+0000361466 00000 n
+0000369661 00000 n
+0000369693 00000 n
0000000556 00000 f
0000000557 00000 f
0000000558 00000 f
@@ -5532,9 +5551,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000568 00000 f
0000000569 00000 f
0000000573 00000 f
-0000047619 00000 n
-0000052273 00000 n
-0000052305 00000 n
+0000361540 00000 n
+0000369543 00000 n
+0000369575 00000 n
0000000574 00000 f
0000000575 00000 f
0000000576 00000 f
@@ -5567,9 +5586,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000603 00000 f
0000000604 00000 f
0000000608 00000 f
-0000047692 00000 n
-0000052155 00000 n
-0000052187 00000 n
+0000361613 00000 n
+0000369425 00000 n
+0000369457 00000 n
0000000609 00000 f
0000000610 00000 f
0000000611 00000 f
@@ -5586,9 +5605,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000622 00000 f
0000000623 00000 f
0000000627 00000 f
-0000047764 00000 n
-0000052037 00000 n
-0000052069 00000 n
+0000361685 00000 n
+0000369307 00000 n
+0000369339 00000 n
0000000628 00000 f
0000000629 00000 f
0000000630 00000 f
@@ -5604,9 +5623,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000640 00000 f
0000000641 00000 f
0000000645 00000 f
-0000047836 00000 n
-0000051919 00000 n
-0000051951 00000 n
+0000361757 00000 n
+0000369189 00000 n
+0000369221 00000 n
0000000646 00000 f
0000000647 00000 f
0000000648 00000 f
@@ -5622,9 +5641,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000658 00000 f
0000000659 00000 f
0000000663 00000 f
-0000047910 00000 n
-0000051801 00000 n
-0000051833 00000 n
+0000361831 00000 n
+0000369071 00000 n
+0000369103 00000 n
0000000664 00000 f
0000000665 00000 f
0000000666 00000 f
@@ -5657,13 +5676,13 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000693 00000 f
0000000694 00000 f
0000000698 00000 f
-0000047983 00000 n
-0000051683 00000 n
-0000051715 00000 n
+0000361904 00000 n
+0000368953 00000 n
+0000368985 00000 n
0000000702 00000 f
-0000048054 00000 n
-0000051565 00000 n
-0000051597 00000 n
+0000361975 00000 n
+0000368835 00000 n
+0000368867 00000 n
0000000703 00000 f
0000000704 00000 f
0000000705 00000 f
@@ -5680,9 +5699,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000716 00000 f
0000000717 00000 f
0000000721 00000 f
-0000048126 00000 n
-0000051447 00000 n
-0000051479 00000 n
+0000362047 00000 n
+0000368717 00000 n
+0000368749 00000 n
0000000722 00000 f
0000000723 00000 f
0000000724 00000 f
@@ -5697,9 +5716,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000733 00000 f
0000000734 00000 f
0000000738 00000 f
-0000048198 00000 n
-0000051329 00000 n
-0000051361 00000 n
+0000362119 00000 n
+0000368599 00000 n
+0000368631 00000 n
0000000739 00000 f
0000000740 00000 f
0000000741 00000 f
@@ -5715,9 +5734,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000751 00000 f
0000000752 00000 f
0000000756 00000 f
-0000048272 00000 n
-0000051211 00000 n
-0000051243 00000 n
+0000362193 00000 n
+0000368481 00000 n
+0000368513 00000 n
0000000757 00000 f
0000000758 00000 f
0000000759 00000 f
@@ -5747,13 +5766,13 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000783 00000 f
0000000784 00000 f
0000000788 00000 f
-0000048345 00000 n
-0000051093 00000 n
-0000051125 00000 n
+0000362266 00000 n
+0000368363 00000 n
+0000368395 00000 n
0000000792 00000 f
-0000048416 00000 n
-0000050975 00000 n
-0000051007 00000 n
+0000362337 00000 n
+0000368245 00000 n
+0000368277 00000 n
0000000793 00000 f
0000000794 00000 f
0000000795 00000 f
@@ -5770,9 +5789,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000806 00000 f
0000000807 00000 f
0000000811 00000 f
-0000048488 00000 n
-0000050857 00000 n
-0000050889 00000 n
+0000362409 00000 n
+0000368127 00000 n
+0000368159 00000 n
0000000812 00000 f
0000000813 00000 f
0000000814 00000 f
@@ -5787,9 +5806,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000823 00000 f
0000000824 00000 f
0000000828 00000 f
-0000048560 00000 n
-0000050739 00000 n
-0000050771 00000 n
+0000362481 00000 n
+0000368009 00000 n
+0000368041 00000 n
0000000829 00000 f
0000000830 00000 f
0000000831 00000 f
@@ -5805,9 +5824,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000841 00000 f
0000000842 00000 f
0000000846 00000 f
-0000048634 00000 n
-0000050621 00000 n
-0000050653 00000 n
+0000362555 00000 n
+0000367891 00000 n
+0000367923 00000 n
0000000847 00000 f
0000000848 00000 f
0000000849 00000 f
@@ -5839,14 +5858,14 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000875 00000 f
0000000876 00000 f
0000000877 00000 f
-0000000881 00001 f
-0000048707 00000 n
-0000050503 00000 n
-0000050535 00000 n
+0000000881 00000 f
+0000362628 00000 n
+0000367773 00000 n
+0000367805 00000 n
0000000885 00000 f
-0000048778 00000 n
-0000050385 00000 n
-0000050417 00000 n
+0000362699 00000 n
+0000367655 00000 n
+0000367687 00000 n
0000000886 00000 f
0000000887 00000 f
0000000888 00000 f
@@ -5863,9 +5882,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000899 00000 f
0000000900 00000 f
0000000904 00000 f
-0000048850 00000 n
-0000050267 00000 n
-0000050299 00000 n
+0000362771 00000 n
+0000367537 00000 n
+0000367569 00000 n
0000000905 00000 f
0000000906 00000 f
0000000907 00000 f
@@ -5880,9 +5899,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000916 00000 f
0000000917 00000 f
0000000921 00000 f
-0000048922 00000 n
-0000050149 00000 n
-0000050181 00000 n
+0000362843 00000 n
+0000367419 00000 n
+0000367451 00000 n
0000000922 00000 f
0000000923 00000 f
0000000924 00000 f
@@ -5898,9 +5917,9 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000934 00000 f
0000000935 00000 f
0000000939 00000 f
-0000048996 00000 n
-0000050031 00000 n
-0000050063 00000 n
+0000362917 00000 n
+0000367301 00000 n
+0000367333 00000 n
0000000940 00000 f
0000000941 00000 f
0000000942 00000 f
@@ -5918,103 +5937,440 @@ kæ(†ìlYÆÛœz»ÏDs7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"Ê:©#ß?^Ù‹me
Ù
ìË°uº‹Ú~Ù 0000000954 00000 f
0000000955 00000 f
0000000956 00000 f
-0000000957 00001 f
+0000000957 00000 f
0000000958 00000 f
0000000959 00000 f
0000000960 00000 f
0000000961 00000 f
+0000000962 00000 f
+0000000963 00000 f
+0000000964 00000 f
+0000000965 00000 f
+0000000966 00000 f
+0000000967 00000 f
+0000000968 00000 f
0000000969 00000 f
-0000174447 00000 n
-0000174523 00000 n
-0000174747 00000 n
-0000175772 00000 n
-0000183336 00000 n
-0000248925 00000 n
-0000314514 00000 n
-0000000974 00001 f
-0000055683 00000 n
-0000049069 00000 n
-0000049913 00000 n
-0000049945 00000 n
-0000000987 00001 f
-0000049140 00000 n
-0000049795 00000 n
+0000000970 00000 f
+0000000974 00000 f
+0000362990 00000 n
+0000367183 00000 n
+0000367215 00000 n
+0000000978 00000 f
+0000363061 00000 n
+0000367065 00000 n
+0000367097 00000 n
+0000000979 00000 f
+0000000980 00000 f
+0000000981 00000 f
+0000000982 00000 f
+0000000983 00000 f
+0000000984 00000 f
+0000000985 00000 f
+0000000986 00000 f
+0000000987 00000 f
+0000000988 00000 f
+0000000989 00000 f
+0000000990 00000 f
+0000000991 00000 f
+0000000992 00000 f
+0000000993 00000 f
+0000000997 00000 f
+0000363133 00000 n
+0000366947 00000 n
+0000366979 00000 n
+0000000998 00000 f
+0000000999 00000 f
+0000001000 00000 f
+0000001001 00000 f
+0000001002 00000 f
+0000001003 00000 f
+0000001004 00000 f
+0000001005 00000 f
+0000001006 00000 f
+0000001007 00000 f
+0000001008 00000 f
+0000001009 00000 f
+0000001010 00000 f
+0000001014 00000 f
+0000363205 00000 n
+0000366827 00000 n
+0000366860 00000 n
+0000001015 00000 f
+0000001016 00000 f
+0000001017 00000 f
+0000001018 00000 f
+0000001019 00000 f
+0000001020 00000 f
+0000001021 00000 f
+0000001022 00000 f
+0000001023 00000 f
+0000001024 00000 f
+0000001025 00000 f
+0000001026 00000 f
+0000001027 00000 f
+0000001028 00000 f
+0000001032 00000 f
+0000363282 00000 n
+0000366707 00000 n
+0000366740 00000 n
+0000001033 00000 f
+0000001034 00000 f
+0000001035 00000 f
+0000001036 00000 f
+0000001037 00000 f
+0000001038 00000 f
+0000001039 00000 f
+0000001040 00000 f
+0000001041 00000 f
+0000001042 00000 f
+0000001043 00000 f
+0000001044 00000 f
+0000001045 00000 f
+0000001046 00000 f
+0000001047 00000 f
+0000001048 00000 f
+0000001049 00000 f
+0000001050 00000 f
+0000001051 00000 f
+0000001052 00000 f
+0000001053 00000 f
+0000001055 00000 f
+0000001397 00000 n
+0000001061 00000 f
+0000363358 00000 n
+0000363432 00000 n
+0000363507 00000 n
+0000363582 00000 n
+0000363659 00000 n
+0000001062 00000 f
+0000001063 00000 f
+0000001064 00000 f
+0000001065 00000 f
+0000001066 00000 f
+0000001067 00000 f
+0000001068 00000 f
+0000001069 00000 f
+0000001070 00000 f
+0000001071 00000 f
+0000001072 00000 f
+0000001073 00000 f
+0000001074 00000 f
+0000001075 00000 f
+0000001076 00000 f
+0000001077 00000 f
+0000001078 00000 f
+0000001079 00000 f
+0000001080 00000 f
+0000001081 00000 f
+0000001082 00000 f
+0000001083 00000 f
+0000001084 00000 f
+0000001085 00000 f
+0000001086 00000 f
+0000001087 00000 f
+0000001088 00000 f
+0000001089 00000 f
+0000001090 00000 f
+0000001091 00000 f
+0000001092 00000 f
+0000001093 00000 f
+0000001094 00000 f
+0000001095 00000 f
+0000001096 00000 f
+0000001097 00000 f
+0000001098 00000 f
+0000001099 00000 f
+0000001100 00000 f
+0000001101 00000 f
+0000001102 00000 f
+0000001103 00000 f
+0000001104 00000 f
+0000001105 00000 f
+0000001106 00000 f
+0000001107 00000 f
+0000001108 00000 f
+0000001109 00000 f
+0000001110 00000 f
+0000001111 00000 f
+0000001112 00000 f
+0000001113 00000 f
+0000001114 00000 f
+0000001115 00000 f
+0000001116 00000 f
+0000001117 00000 f
+0000001128 00000 f
+0000366587 00000 n
+0000366620 00000 n
+0000366467 00000 n
+0000366500 00000 n
+0000366347 00000 n
+0000366380 00000 n
+0000366227 00000 n
+0000366260 00000 n
+0000366107 00000 n
+0000366140 00000 n
+0000001129 00000 f
+0000001130 00000 f
+0000001131 00000 f
+0000001132 00000 f
+0000001133 00000 f
+0000001134 00000 f
+0000001135 00000 f
+0000001136 00000 f
+0000001137 00000 f
+0000001144 00000 f
+0000363735 00000 n
+0000363824 00000 n
+0000363898 00000 n
+0000363973 00000 n
+0000364048 00000 n
+0000364125 00000 n
+0000001145 00000 f
+0000001146 00000 f
+0000001147 00000 f
+0000001148 00000 f
+0000001149 00000 f
+0000001150 00000 f
+0000001151 00000 f
+0000001152 00000 f
+0000001153 00000 f
+0000001154 00000 f
+0000001155 00000 f
+0000001156 00000 f
+0000001157 00000 f
+0000001158 00000 f
+0000001159 00000 f
+0000001160 00000 f
+0000001161 00000 f
+0000001162 00000 f
+0000001163 00000 f
+0000001164 00000 f
+0000001165 00000 f
+0000001166 00000 f
+0000001167 00000 f
+0000001168 00000 f
+0000001169 00000 f
+0000001170 00000 f
+0000001171 00000 f
+0000001172 00000 f
+0000001173 00000 f
+0000001174 00000 f
+0000001175 00000 f
+0000001176 00000 f
+0000001177 00000 f
+0000001178 00000 f
+0000001179 00000 f
+0000001180 00000 f
+0000001181 00000 f
+0000001182 00000 f
+0000001183 00000 f
+0000001184 00000 f
+0000001185 00000 f
+0000001186 00000 f
+0000001187 00000 f
+0000001188 00000 f
+0000001189 00000 f
+0000001190 00000 f
+0000001191 00000 f
+0000001192 00000 f
+0000001193 00000 f
+0000001194 00000 f
+0000001195 00000 f
+0000001196 00000 f
+0000001197 00000 f
+0000001198 00000 f
+0000001199 00000 f
+0000001200 00000 f
+0000001213 00000 f
+0000365987 00000 n
+0000366020 00000 n
+0000365867 00000 n
+0000365900 00000 n
+0000365747 00000 n
+0000365780 00000 n
+0000365627 00000 n
+0000365660 00000 n
+0000365507 00000 n
+0000365540 00000 n
+0000365387 00000 n
+0000365420 00000 n
+0000001214 00000 f
+0000001215 00000 f
+0000001216 00000 f
+0000001217 00000 f
+0000001218 00000 f
+0000001219 00000 f
+0000001220 00000 f
+0000001221 00000 f
+0000001242 00000 f
+0000000000 00000 f
+0000364201 00000 n
+0000364290 00000 n
+0000364364 00000 n
+0000364439 00000 n
+0000364514 00000 n
+0000364591 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000365267 00000 n
+0000365300 00000 n
+0000365147 00000 n
+0000365180 00000 n
+0000365027 00000 n
+0000365060 00000 n
+0000364907 00000 n
+0000364940 00000 n
+0000364787 00000 n
+0000364820 00000 n
+0000364667 00000 n
+0000364700 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000165196 00000 n
+0000164010 00000 n
+0000164099 00000 n
+0000164173 00000 n
+0000164248 00000 n
+0000164323 00000 n
+0000164400 00000 n
+0000372953 00000 n
+0000046731 00000 n
+0000167129 00000 n
+0000066385 00000 n
+0000066270 00000 n
0000049827 00000 n
-0000058541 00000 n
-0000159418 00000 n
-0000160143 00000 n
-0000173817 00000 n
-0000060510 00000 n
-0000060547 00000 n
-0000160206 00000 n
-0000159481 00000 n
-0000063196 00000 n
-0000000997 00001 f
-0000147299 00000 n
-0000148055 00000 n
-0000159355 00000 n
-0000148118 00000 n
-0000147362 00000 n
-0000063689 00000 n
-0000049212 00000 n
-0000049677 00000 n
-0000049709 00000 n
-0000001004 00001 f
-0000132732 00000 n
-0000133484 00000 n
-0000147235 00000 n
-0000133547 00000 n
-0000132795 00000 n
-0000064172 00000 n
-0000001014 00001 f
-0000120560 00000 n
-0000121317 00000 n
-0000132668 00000 n
-0000121381 00000 n
-0000120624 00000 n
-0000064671 00000 n
-0000049284 00000 n
-0000049557 00000 n
-0000049590 00000 n
-0000001021 00001 f
-0000106070 00000 n
-0000106822 00000 n
-0000120496 00000 n
-0000106886 00000 n
-0000106134 00000 n
-0000065160 00000 n
-0000001022 00001 f
-0000001032 00001 f
-0000093888 00000 n
-0000094644 00000 n
-0000106006 00000 n
-0000094708 00000 n
-0000093952 00000 n
-0000065664 00000 n
-0000049361 00000 n
-0000049437 00000 n
-0000049470 00000 n
-0000001039 00001 f
-0000079247 00000 n
-0000080008 00000 n
-0000093824 00000 n
-0000080072 00000 n
-0000079311 00000 n
-0000066147 00000 n
-0000000000 00001 f
-0000067133 00000 n
-0000067894 00000 n
-0000079183 00000 n
-0000067958 00000 n
-0000067197 00000 n
-0000066651 00000 n
-0000058655 00000 n
-0000058947 00000 n
-0000056363 00000 n
-0000362622 00000 n
-0000059211 00000 n
-0000173880 00000 n
-0000173932 00000 n
-0000058383 00000 n
-0000000982 00000 n
-trailer
<</Size 1055/Root 1 0 R/Info 1049 0 R/ID[<DFAD564605F549E3ABF1FC747EBA5A34><45AB28F93CAE4209BAB0B0278EBC9323>]>>
startxref
362760
%%EOF
\ No newline at end of file +0000050354 00000 n
+0000050894 00000 n
+0000051425 00000 n
+0000051967 00000 n
+0000052501 00000 n
+0000053037 00000 n
+0000053571 00000 n
+0000048764 00000 n
+0000049260 00000 n
+0000049312 00000 n
+0000149504 00000 n
+0000149568 00000 n
+0000137318 00000 n
+0000137382 00000 n
+0000122718 00000 n
+0000122782 00000 n
+0000110491 00000 n
+0000110555 00000 n
+0000095974 00000 n
+0000096038 00000 n
+0000083742 00000 n
+0000083806 00000 n
+0000069074 00000 n
+0000069138 00000 n
+0000054106 00000 n
+0000054170 00000 n
+0000054920 00000 n
+0000054984 00000 n
+0000066206 00000 n
+0000066424 00000 n
+0000069865 00000 n
+0000069929 00000 n
+0000083678 00000 n
+0000084551 00000 n
+0000084615 00000 n
+0000095910 00000 n
+0000096756 00000 n
+0000096820 00000 n
+0000110427 00000 n
+0000111301 00000 n
+0000111365 00000 n
+0000122654 00000 n
+0000123502 00000 n
+0000123566 00000 n
+0000137254 00000 n
+0000138131 00000 n
+0000138195 00000 n
+0000149440 00000 n
+0000150263 00000 n
+0000150327 00000 n
+0000163946 00000 n
+0000165076 00000 n
+0000165109 00000 n
+0000164956 00000 n
+0000164989 00000 n
+0000164836 00000 n
+0000164869 00000 n
+0000164716 00000 n
+0000164749 00000 n
+0000164596 00000 n
+0000164629 00000 n
+0000164476 00000 n
+0000164509 00000 n
+0000165488 00000 n
+0000165798 00000 n
+0000167207 00000 n
+0000167437 00000 n
+0000168418 00000 n
+0000175955 00000 n
+0000241545 00000 n
+0000307135 00000 n
+0000373027 00000 n
+trailer
<</Size 1392/Root 1 0 R/Info 1391 0 R/ID[<DFAD564605F549E3ABF1FC747EBA5A34><483E7E53040A4057B79E46A3828ABB5E>]>>
startxref
373165
%%EOF
\ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/doc/model/Entity.scala b/src/compiler/scala/tools/nsc/doc/model/Entity.scala index 37485bccab..4fb0341684 100644 --- a/src/compiler/scala/tools/nsc/doc/model/Entity.scala +++ b/src/compiler/scala/tools/nsc/doc/model/Entity.scala @@ -50,6 +50,15 @@ trait Entity { } +object Entity { + private def isDeprecated(x: Entity) = x match { + case x: MemberEntity => x.deprecation.isDefined + case _ => false + } + /** Ordering deprecated things last. */ + implicit lazy val EntityOrdering: Ordering[Entity] = + Ordering[(Boolean, String)] on (x => (isDeprecated(x), x.name)) +} /** A template, which is either a class, trait, object or package. Depending on whether documentation is available * or not, the template will be modeled as a [scala.tools.nsc.doc.model.NoDocTemplate] or a @@ -156,7 +165,11 @@ trait MemberEntity extends Entity { def isAbstract: Boolean } - +object MemberEntity { + // Oh contravariance, contravariance, wherefore art thou contravariance? + // Note: the above works for both the commonly misunderstood meaning of the line and the real one. + implicit lazy val MemberEntityOrdering: Ordering[MemberEntity] = Entity.EntityOrdering on (x => x) +} /** An entity that is parameterized by types */ trait HigherKinded extends Entity { diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala index a7f22e94ff..405da29a57 100644 --- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala @@ -17,7 +17,7 @@ import model.{ RootPackage => RootPackageEntity } class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory: ModelFactory with CommentFactory with TreeFactory => import global._ - import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage, NothingClass, AnyClass, AnyRefClass } + import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage, NothingClass, AnyClass, AnyValClass, AnyRefClass } private var droppedPackages = 0 def templatesCount = templatesCache.size - droppedPackages @@ -25,6 +25,8 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory private var modelFinished = false private var universe: Universe = null + private lazy val noSubclassCache = Set(AnyClass, AnyRefClass, ObjectClass, ScalaObjectClass) + /** */ def makeModel: Option[Universe] = { val universe = new Universe { thisUniverse => @@ -160,10 +162,18 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory * * All non-package members (including other templates, as full templates). */ abstract class DocTemplateImpl(sym: Symbol, inTpl: => DocTemplateImpl) extends MemberImpl(sym, inTpl) with TemplateImpl with HigherKindedImpl with DocTemplateEntity { //if (inTpl != null) println("mbr " + sym + " in " + (inTpl.toRoot map (_.sym)).mkString(" > ")) + if (settings.verbose.value) + inform("Creating doc template for " + sym) + templatesCache += (sym -> this) lazy val definitionName = optimize(inDefinitionTemplates.head.qualifiedName + "." + name) override def toRoot: List[DocTemplateImpl] = this :: inTpl.toRoot - def inSource = if (sym.sourceFile != null) Some((sym.sourceFile, sym.pos.line)) else None + def inSource = + if (sym.sourceFile != null && ! sym.isSynthetic) + Some((sym.sourceFile, sym.pos.line)) + else + None + def sourceUrl = { def fixPath(s: String) = s.replaceAll("\\" + java.io.File.separator, "/") val assumedSourceRoot: String = { @@ -187,33 +197,40 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory else None } def parentType = { - if (sym.isPackage) None else { + if (sym.isPackage || sym == AnyClass) None else { val tps = (sym.tpe.parents filter (_ != ScalaObjectClass.tpe)) map { _.asSeenFrom(sym.thisType, sym) } Some(makeType(RefinedType(tps, EmptyScope), inTpl)) } } val linearization: List[(TemplateEntity, TypeEntity)] = { - val acs = sym.ancestors filter { _ != ScalaObjectClass } - val tps = acs map { cls => makeType(sym.info.baseType(cls), this) } - val tpls = acs map { makeTemplate(_) } - tpls map { - case dtpl: DocTemplateImpl => dtpl.registerSubClass(this) - case _ => + val acs = sym.ancestors filterNot (_ == ScalaObjectClass) + val tps = acs map (cls => makeType(sym.info.baseType(cls), this)) + val tpls = acs map makeTemplate + + tpls foreach { + case dtpl: DocTemplateImpl => dtpl.registerSubClass(this) + case _ => } tpls zip tps } def linearizationTemplates = linearization map { _._1 } def linearizationTypes = linearization map { _._2 } - private lazy val subClassesCache = mutable.Buffer.empty[DocTemplateEntity] + + private lazy val subClassesCache = ( + if (noSubclassCache(sym)) null + else mutable.ListBuffer[DocTemplateEntity]() + ) def registerSubClass(sc: DocTemplateEntity): Unit = { - assert(subClassesCache != null) - subClassesCache += sc + if (subClassesCache != null) + subClassesCache += sc } - def subClasses = subClassesCache.toList + def subClasses = if (subClassesCache == null) Nil else subClassesCache.toList + protected lazy val memberSyms = // Only this class's constructors are part of its members, inherited constructors are not. sym.info.members.filter(s => localShouldDocument(s) && (!s.isConstructor || s.owner == sym)) + val members = memberSyms flatMap (makeMember(_, this)) val templates = members collect { case c: DocTemplateEntity => c } val methods = members collect { case d: Def => d } @@ -591,8 +608,14 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory /* Refined types */ case RefinedType(parents, defs) => appendTypes0((if (parents.length > 1) parents filterNot (_ == ObjectClass.tpe) else parents), " with ") - if (!defs.isEmpty) { - nameBuffer append " {...}" // TODO: actually print the refinement + // XXX Still todo: properly printing refinements. + // Since I didn't know how to go about displaying a multi-line type, I went with + // printing single method refinements (which should be the most common) and printing + // the number of members if there are more. + defs.toList match { + case Nil => () + case x :: Nil => nameBuffer append (" { " + x.defString + " }") + case xs => nameBuffer append (" { ... /* %d definitions in type refinement */ }" format xs.size) } /* Eval-by-name types */ case NullaryMethodType(result) => diff --git a/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala b/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala index 7485533641..e332b28c67 100644 --- a/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala @@ -21,7 +21,7 @@ import util.{NoPosition, Position} trait CommentFactory { thisFactory: ModelFactory with CommentFactory => val global: Global - import global.reporter + import global.{ reporter, definitions } protected val commentCache = mutable.HashMap.empty[(global.Symbol, TemplateImpl), Comment] @@ -172,7 +172,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => /** Safe HTML tags that can be kept. */ protected val SafeTags = - new Regex("""((&\w+;)|(&#\d+;)|(<code( [^>]*)?>.*?</code>)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""") + new Regex("""((&\w+;)|(&#\d+;)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|code|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""") protected val safeTagMarker = '\u000E' @@ -515,10 +515,50 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => /* INLINES */ + val OPEN_TAG = "^<([A-Za-z]+)( [^>]*)?(/?)>$".r + val CLOSE_TAG = "^</([A-Za-z]+)>$".r + private def readHTMLFrom(begin: HtmlTag): String = { + val list = mutable.ListBuffer.empty[String] + val stack = mutable.ListBuffer.empty[String] + + begin.close match { + case Some(HtmlTag(CLOSE_TAG(s))) => + stack += s + case _ => + return "" + } + + do { + readUntil { char == safeTagMarker || char == endOfText } + val str = getRead() + nextChar() + + list += str + + str match { + case OPEN_TAG(s, _, standalone) => { + if (standalone != "/") { + stack += s + } + } + case CLOSE_TAG(s) => { + if (s == stack.last) { + stack.remove(stack.length-1) + } + } + case _ => ; + } + } while (stack.length > 0 && char != endOfText); + + return list.mkString("") + } def inline(isInlineEnd: => Boolean): Inline = { def inline0(): Inline = { - if (char == safeTagMarker) htmlTag() + if (char == safeTagMarker) { + val tag = htmlTag() + HtmlTag(tag.data + readHTMLFrom(tag)) + } else if (check("'''")) bold() else if (check("''")) italic() else if (check("`")) monospace() @@ -563,7 +603,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => } - def htmlTag(): Inline = { + def htmlTag(): HtmlTag = { jump(safeTagMarker) readUntil(safeTagMarker) if (char != endOfText) jump(safeTagMarker) @@ -634,7 +674,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => } def link(): Inline = { - val SchemeUri = new Regex("""([^:]+:.*)""") + val SchemeUri = """([^:]+:.*)""".r jump("[[") readUntil { check("]]") || check(" ") } val target = getRead() @@ -645,18 +685,20 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory => }) else None jump("]]") + (target, title) match { - case (SchemeUri(uri), Some(title)) => - Link(uri, title) - case (SchemeUri(uri), None) => - Link(uri, Text(uri)) - case (qualName, None) => - entityLink(qualName) - case (qualName, Some(text)) => - reportError(pos, "entity link to " + qualName + " cannot have a custom title'" + text + "'") + case (SchemeUri(uri), optTitle) => + Link(uri, optTitle getOrElse Text(uri)) + case (qualName, optTitle) => + optTitle foreach (text => reportError(pos, "entity link to " + qualName + " cannot have a custom title'" + text + "'")) + // XXX rather than warning here we should allow unqualified names + // to refer to members of the same package. The "package exists" + // exclusion is because [[scala]] is used in some scaladoc. + if (!qualName.contains(".") && !definitions.packageExists(qualName)) + reportError(pos, "entity link to " + qualName + " should be a fully qualified name") + entityLink(qualName) } - } /* UTILITY */ diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index 76df0a6bd6..8ec93d70e3 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -103,11 +103,8 @@ trait CompilerControl { self: Global => throw new FatalError("no context found for "+pos) } - private def postWorkItem(item: WorkItem) { - scheduler.postWorkItem(item) - } - - private def onCompilerThread = Thread.currentThread == compileRunner + private def postWorkItem(item: WorkItem) = + if (item.onCompilerThread) item() else scheduler.postWorkItem(item) /** Makes sure a set of compilation units is loaded and parsed. * Returns () to syncvar `response` on completions. @@ -132,13 +129,8 @@ trait CompilerControl { self: Global => /** Sets sync var `response` to the fully attributed & typechecked tree contained in `source`. * @pre `source` needs to be loaded. */ - def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) = { - if (debugIDE) { - println("ask type called") - new Exception().printStackTrace() - } + def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) = postWorkItem(new AskTypeItem(source, forceReload, response)) - } /** Sets sync var `response` to the position of the definition of the given link in * the given sourcefile. @@ -230,7 +222,9 @@ trait CompilerControl { self: Global => } /** Asks for a computation to be done quickly on the presentation compiler thread */ - def ask[A](op: () => A): A = scheduler doQuickly op + def ask[A](op: () => A): A = if (self.onCompilerThread) op() else scheduler doQuickly op + + def onCompilerThread = Thread.currentThread == compileRunner /** Info given for every member found by completion */ @@ -258,7 +252,9 @@ trait CompilerControl { self: Global => // items that get sent to scheduler - abstract class WorkItem extends (() => Unit) + abstract class WorkItem extends (() => Unit) { + def onCompilerThread = self.onCompilerThread + } case class ReloadItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem { def apply() = reload(sources, response) @@ -296,12 +292,12 @@ trait CompilerControl { self: Global => } class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree]) extends WorkItem { - def apply() = self.waitLoadedTyped(source, response) + def apply() = self.waitLoadedTyped(source, response, this.onCompilerThread) override def toString = "wait loaded & typed "+source } class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree]) extends WorkItem { - def apply() = self.getParsedEntered(source, keepLoaded, response) + def apply() = self.getParsedEntered(source, keepLoaded, response, this.onCompilerThread) override def toString = "getParsedEntered "+source+", keepLoaded = "+keepLoaded } } @@ -321,4 +317,3 @@ object ShutdownReq extends ControlThrowable class NoSuchUnitError(file: AbstractFile) extends Exception("no unit found for file "+file) class MissingResponse extends Exception("response missing") - diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index ddc870a045..2563feeb72 100644 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -277,7 +277,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") * @param pos The position of the tree if polling while typechecking, NoPosition otherwise * */ - protected[interactive] def pollForWork(pos: Position) { + private[interactive] def pollForWork(pos: Position) { if (!interruptsEnabled) return if (pos == NoPosition || nodesSeen % yieldPeriod == 0) Thread.`yield`() @@ -386,7 +386,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") private var threadId = 0 /** The current presentation compiler runner */ - @volatile protected[interactive] var compileRunner = newRunnerThread() + @volatile private[interactive] var compileRunner = newRunnerThread() /** Create a new presentation compiler runner. */ @@ -553,7 +553,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } } - protected def reloadSource(source: SourceFile) { + private def reloadSource(source: SourceFile) { val unit = new RichCompilationUnit(source) unitOfFile(source.file) = unit reset(unit) @@ -561,7 +561,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** Make sure a set of compilation units is loaded and parsed */ - protected def reloadSources(sources: List[SourceFile]) { + private def reloadSources(sources: List[SourceFile]) { newTyperRun() minRunId = currentRunId sources foreach reloadSource @@ -569,7 +569,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** Make sure a set of compilation units is loaded and parsed */ - protected def reload(sources: List[SourceFile], response: Response[Unit]) { + private[interactive] def reload(sources: List[SourceFile], response: Response[Unit]) { informIDE("reload: " + sources) lastWasReload = true respond(response)(reloadSources(sources)) @@ -577,7 +577,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** A fully attributed tree located at position `pos` */ - protected def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match { + private def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match { case None => reloadSources(List(pos.source)) val result = typedTreeAt(pos) @@ -612,31 +612,28 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** A fully attributed tree corresponding to the entire compilation unit */ - protected def typedTree(source: SourceFile, forceReload: Boolean): Tree = { + private def typedTree(source: SourceFile, forceReload: Boolean): Tree = { informIDE("typedTree " + source + " forceReload: " + forceReload) val unit = getOrCreateUnitOf(source) if (forceReload) reset(unit) parseAndEnter(unit) - if (unit.status <= PartiallyChecked) { - //newTyperRun() // not deeded for idempotent type checker phase - typeCheck(unit) - } + if (unit.status <= PartiallyChecked) typeCheck(unit) unit.body } /** Set sync var `response` to a fully attributed tree located at position `pos` */ - protected def getTypedTreeAt(pos: Position, response: Response[Tree]) { + private[interactive] def getTypedTreeAt(pos: Position, response: Response[Tree]) { respond(response)(typedTreeAt(pos)) } /** Set sync var `response` to a fully attributed tree corresponding to the * entire compilation unit */ - protected def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) { + private[interactive] def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) { respond(response)(typedTree(source, forceReload)) } /** Implements CompilerControl.askLinkPos */ - protected def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) { + private[interactive] def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) { informIDE("getLinkPos "+sym+" "+source) respond(response) { val preExisting = unitOfFile isDefinedAt source.file @@ -699,7 +696,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") import analyzer.{SearchResult, ImplicitSearch} - protected def getScopeCompletion(pos: Position, response: Response[List[Member]]) { + private[interactive] def getScopeCompletion(pos: Position, response: Response[List[Member]]) { informIDE("getScopeCompletion" + pos) respond(response) { scopeMembers(pos) } } @@ -740,7 +737,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } /** Return all members visible without prefix in context enclosing `pos`. */ - protected def scopeMembers(pos: Position): List[ScopeMember] = { + private def scopeMembers(pos: Position): List[ScopeMember] = { typedTreeAt(pos) // to make sure context is entered val context = doLocateContext(pos) val locals = new Members[ScopeMember] @@ -773,13 +770,13 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") result } - protected def getTypeCompletion(pos: Position, response: Response[List[Member]]) { + private[interactive] def getTypeCompletion(pos: Position, response: Response[List[Member]]) { informIDE("getTypeCompletion " + pos) respondGradually(response) { typeMembers(pos) } //if (debugIDE) typeMembers(pos) } - protected def typeMembers(pos: Position): Stream[List[TypeMember]] = { + private def typeMembers(pos: Position): Stream[List[TypeMember]] = { var tree = typedTreeAt(pos) // if tree consists of just x. or x.fo where fo is not yet a full member name @@ -848,40 +845,42 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } } - /** Synchronous version of askStructure. */ - def getStructure(source: SourceFile, response: Response[Tree]) { - getUnit(source) match { - case Some(_) => waitLoadedTyped(source, response) - case None => getParsedEntered(source, false, response) - } - } - /** Implements CompilerControl.askLoadedTyped */ - protected def waitLoadedTyped(source: SourceFile, response: Response[Tree]) { + private[interactive] def waitLoadedTyped(source: SourceFile, response: Response[Tree], onSameThread: Boolean = true) { getUnit(source) match { case Some(unit) => - if (unit.isUpToDate) { debugLog("already typed"); response set unit.body } - else { debugLog("wait for later"); outOfDate = true; waitLoadedTypeResponses(source) += response } + if (unit.isUpToDate) { + debugLog("already typed"); + response set unit.body + } else if (onSameThread) { + getTypedTree(source, forceReload = false, response) + } else { + debugLog("wait for later") + outOfDate = true + waitLoadedTypeResponses(source) += response + } case None => debugLog("load unit and type") try reloadSources(List(source)) - finally waitLoadedTyped(source, response) + finally waitLoadedTyped(source, response, onSameThread) } } /** Implements CompilerControl.askParsedEntered */ - protected def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) { + private[interactive] def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree], onSameThread: Boolean = true) { getUnit(source) match { case Some(unit) => getParsedEnteredNow(source, response) case None => - if (keepLoaded) - try reloadSources(List(source)) - finally getParsedEnteredNow(source, response) - else if (outOfDate) - getParsedEnteredResponses(source) += response - else - getParsedEnteredNow(source, response) + try { + if (keepLoaded || outOfDate && onSameThread) + reloadSources(List(source)) + } finally { + if (keepLoaded || !outOfDate || onSameThread) + getParsedEnteredNow(source, response) + else + getParsedEnteredResponses(source) += response + } } } diff --git a/src/compiler/scala/tools/nsc/interactive/Picklers.scala b/src/compiler/scala/tools/nsc/interactive/Picklers.scala index 250f648250..53ef20507f 100644 --- a/src/compiler/scala/tools/nsc/interactive/Picklers.scala +++ b/src/compiler/scala/tools/nsc/interactive/Picklers.scala @@ -160,7 +160,7 @@ trait Picklers { self: Global => implicit def askLoadedTypedItem: CondPickler[AskLoadedTypedItem] = pkl[SourceFile] - .wrapped { new AskLoadedTypedItem(_, new Response) } { _.source } + .wrapped { source => new AskLoadedTypedItem(source, new Response) } { _.source } .asClass (classOf[AskLoadedTypedItem]) implicit def askParsedEnteredItem: CondPickler[AskParsedEnteredItem] = diff --git a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala index 39c27cfbb1..85dcff2086 100644 --- a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala @@ -5,8 +5,9 @@ package scala.tools.nsc package interpreter -import scala.tools.nsc.io.AbstractFile +import scala.tools.nsc.io.{ File, AbstractFile } import util.ScalaClassLoader +import java.net.URL /** * A class loader that loads files from a {@link scala.tools.nsc.io.AbstractFile}. @@ -17,28 +18,42 @@ class AbstractFileClassLoader(root: AbstractFile, parent: ClassLoader) extends ClassLoader(parent) with ScalaClassLoader { - private def findBytes(name: String, onError: => Array[Byte]): Array[Byte] = { + protected def classNameToPath(name: String): String = + if (name endsWith ".class") name + else name.replace('.', '/') + ".class" + + protected def findAbstractFile(name: String): AbstractFile = { var file: AbstractFile = root - val pathParts = name.split("[./]").toList + val pathParts = classNameToPath(name) split '/' for (dirPart <- pathParts.init) { file = file.lookupName(dirPart, true) if (file == null) - return onError + return null } - file.lookupName(pathParts.last+".class", false) match { - case null => onError - case file => file.toByteArray + file.lookupName(pathParts.last, false) match { + case null => null + case file => file } } - override def findBytesForClassName(name: String): Array[Byte] = - findBytes(name, super.findBytesForClassName(name)) - + override def getResourceAsStream(name: String) = findAbstractFile(name) match { + case null => super.getResourceAsStream(name) + case file => file.input + } + override def classBytes(name: String): Array[Byte] = findAbstractFile(name) match { + case null => super.classBytes(name) + case file => file.toByteArray + } override def findClass(name: String): JClass = { - val bytes = findBytes(name, throw new ClassNotFoundException(name)) - defineClass(name, bytes, 0, bytes.length) + val bytes = classBytes(name) + if (bytes.isEmpty) throw new ClassNotFoundException(name) + else defineClass(name, bytes, 0, bytes.length) } + // Don't know how to construct an URL for something which exists only in memory + // override def getResource(name: String): URL = findAbstractFile(name) match { + // case null => super.getResource(name) + // case file => new URL(...) + // } } - diff --git a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala index 2dadba3b4c..1b2f6443ae 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala @@ -6,9 +6,7 @@ package scala.tools.nsc package interpreter -import java.io.File import java.lang.reflect -import java.util.jar.{ JarEntry, JarFile } import java.util.concurrent.ConcurrentHashMap import util.ScalaClassLoader import ScalaClassLoader.getSystemLoader diff --git a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala index 94bcf3e4c8..e96918c90c 100644 --- a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala +++ b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala @@ -9,6 +9,6 @@ package interpreter /** A command line for the interpreter. */ class CommandLine(arguments: List[String], error: String => Unit) extends CompilerCommand(arguments, error) { - override val cmdName = "scala" + override def cmdName = "scala" override lazy val fileEndings = List(".scalaint") } diff --git a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala index a775fca92c..cfe932ad0b 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala @@ -55,8 +55,9 @@ trait ConsoleReaderHelper extends ConsoleReader { var linesLeft = if (isPaginationEnabled()) height - 1 else Int.MaxValue val columnSize = longest + marginSize val padded = items map ("%-" + columnSize + "s" format _) + val groupSize = 1 max (width / columnSize) // make sure it doesn't divide to 0 - padded grouped (width / columnSize) foreach { xs => + padded grouped groupSize foreach { xs => println(xs.mkString) linesLeft -= 1 if (linesLeft <= 0) { diff --git a/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala b/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala index bfa6576b25..2c556656ca 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala @@ -33,7 +33,7 @@ trait Dossiers { } class TermDossier(val symbol: TermSymbol, val staticType: Type, val value: AnyRef) extends Dossier { - def runtimeClass: Class[_] = value.getClass + def runtimeClass: JClass = value.getClass def runtimeSymbol: Symbol = safeClass(runtimeClass.getName) getOrElse NoSymbol def runtimeType: Type = runtimeSymbol.tpe def runtimeTypeString = TypeStrings.fromClazz(runtimeClass) diff --git a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala index 584b8867b2..d6e447ca0a 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala @@ -8,7 +8,6 @@ package interpreter import Predef.{ println => _, _ } import java.io.{ BufferedReader, FileReader, PrintWriter } - import scala.sys.process.Process import session._ import scala.tools.nsc.interpreter.{ Results => IR } @@ -44,11 +43,14 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) var settings: Settings = _ var intp: IMain = _ - lazy val power = new Power(this) + lazy val power = { + val g = intp.global + Power[g.type](this, g) + } // TODO // object opt extends AestheticSettings - + // @deprecated("Use `intp` instead.") def interpreter = intp @@ -62,7 +64,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) // Install a signal handler so we can be prodded. private val signallable = - if (isReplDebug) Signallable("Dump repl state.")(dumpCommand("")) + if (isReplDebug) Signallable("Dump repl state.")(dumpCommand()) else null // classpath entries added via :cp @@ -125,7 +127,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) |// Calling Thread.stop on runaway %s with offending code: |// scala> %s""".stripMargin - println(template.format(line.thread, line.code)) + echo(template.format(line.thread, line.code)) // XXX no way to suppress the deprecation warning line.thread.stop() in.redrawLine() @@ -146,12 +148,40 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } /** print a friendly help message */ - def printHelp() = { - out println "All commands can be abbreviated - for example :he instead of :help.\n" - val cmds = commands map (x => (x.usage, x.help)) - val width: Int = cmds map { case (x, _) => x.length } max - val formatStr = "%-" + width + "s %s" - cmds foreach { case (usage, help) => out println formatStr.format(usage, help) } + def helpCommand(line: String): Result = { + if (line == "") helpSummary() + else uniqueCommand(line) match { + case Some(lc) => echo("\n" + lc.longHelp) + case _ => ambiguousError(line) + } + } + private def helpSummary() = { + val usageWidth = commands map (_.usageMsg.length) max + val formatStr = "%-" + usageWidth + "s %s %s" + + echo("All commands can be abbreviated, e.g. :he instead of :help.") + echo("Those marked with a * have more detailed help, e.g. :help imports.\n") + + commands foreach { cmd => + val star = if (cmd.hasLongHelp) "*" else " " + echo(formatStr.format(cmd.usageMsg, star, cmd.help)) + } + } + private def ambiguousError(cmd: String): Result = { + matchingCommands(cmd) match { + case Nil => echo(cmd + ": no such command. Type :help for help.") + case xs => echo(cmd + " is ambiguous: did you mean " + xs.map(":" + _.name).mkString(" or ") + "?") + } + Result(true, None) + } + private def matchingCommands(cmd: String) = commands filter (_.name startsWith cmd) + private def uniqueCommand(cmd: String): Option[LoopCommand] = { + // this lets us add commands willy-nilly and only requires enough command to disambiguate + matchingCommands(cmd) match { + case List(x) => Some(x) + // exact match OK even if otherwise appears ambiguous + case xs => xs find (_.name == cmd) + } } /** Print a welcome message */ @@ -164,28 +194,37 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) stripMargin.format(versionString, javaVmName, javaVersion) val addendum = if (isReplDebug) "\n" + new java.util.Date else "" - plushln(welcomeMsg + addendum) + echo(welcomeMsg + addendum) } /** Show the history */ - def printHistory(xs: List[String]): Result = { - if (history eq NoHistory) - return "No history available." + lazy val historyCommand = new LoopCommand("history", "show the history (optional num is commands to show)") { + override def usage = "[num]" + def defaultLines = 20 - val defaultLines = 20 - val current = history.index - val count = try xs.head.toInt catch { case _: Exception => defaultLines } - val lines = history.asStrings takeRight count - val offset = current - lines.size + 1 + def apply(line: String): Result = { + if (history eq NoHistory) + return "No history available." - for ((line, index) <- lines.zipWithIndex) - println("%3d %s".format(index + offset, line)) + val xs = words(line) + val current = history.index + val count = try xs.head.toInt catch { case _: Exception => defaultLines } + val lines = history.asStrings takeRight count + val offset = current - lines.size + 1 + + for ((line, index) <- lines.zipWithIndex) + echo("%3d %s".format(index + offset, line)) + } } - /** Some print conveniences */ - def println(x: Any) = out println x - def plush(x: Any) = { out print x ; out.flush() } - def plushln(x: Any) = { out println x ; out.flush() } + private def echo(msg: String) = { + out println msg + out.flush() + } + private def echoNoNL(msg: String) = { + out print msg + out.flush() + } /** Search the history */ def searchHistory(_cmdline: String) { @@ -193,7 +232,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) val offset = history.index - history.size + 1 for ((line, index) <- history.asStrings.zipWithIndex ; if line.toLowerCase contains cmdline) - println("%d %s".format(index + offset, line)) + echo("%d %s".format(index + offset, line)) } private var currentPrompt = Properties.shellPromptString @@ -201,39 +240,57 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) /** Prompt to print when awaiting input */ def prompt = currentPrompt + import LoopCommand.{ cmd, nullary } + /** Standard commands **/ - val standardCommands: List[LoopCommand] = { - List( - LineArg("cp", "add an entry (jar or directory) to the classpath", addClasspath), - NoArgs("help", "print this help message", printHelp), - VarArgs("history", "show the history (optional arg: lines to show)", printHistory), - LineArg("h?", "search the history", searchHistory), - LineArg("implicits", "show the implicits in scope (-v to include Predef)", implicitsCommand), - LineArg("javap", "disassemble a file or class name", javapCommand), - LineArg("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand), - OneArg("load", "load and interpret a Scala file", load), - NoArgs("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand), - NoArgs("power", "enable power user mode", powerCmd), - NoArgs("quit", "exit the interpreter", () => Result(false, None)), - NoArgs("replay", "reset execution and replay all previous commands", replay), - LineArg("sh", "fork a shell and run a command", shCommand), - NoArgs("silent", "disable/enable automatic printing of results", verbosity), - LineArg("type", "display the type of an expression without evaluating it", typeCommand) - ) - } + lazy val standardCommands = List( + cmd("cp", "<path>", "add a jar or directory to the classpath", addClasspath), + cmd("help", "[command]", "print this summary or command-specific help", helpCommand), + historyCommand, + cmd("h?", "<string>", "search the history", searchHistory), + cmd("imports", "[name name ...]", "show import history, identifying sources of names", importsCommand), + cmd("implicits", "[-v]", "show the implicits in scope", implicitsCommand), + cmd("javap", "<path|class>", "disassemble a file or class name", javapCommand), + nullary("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand), + cmd("load", "<path>", "load and interpret a Scala file", loadCommand), + nullary("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand), + nullary("power", "enable power user mode", powerCmd), + nullary("quit", "exit the interpreter", () => Result(false, None)), + nullary("replay", "reset execution and replay all previous commands", replay), + shCommand, + nullary("silent", "disable/enable automatic printing of results", verbosity), + cmd("type", "<expr>", "display the type of an expression without evaluating it", typeCommand) + ) /** Power user commands */ - val powerCommands: List[LoopCommand] = { - List( - LineArg("dump", "displays a view of the interpreter's internal state", dumpCommand), - LineArg("phase", "set the implicit phase for power commands", phaseCommand), - LineArg("wrap", "code to wrap around all executions", wrapCommand) - ) - } + lazy val powerCommands: List[LoopCommand] = List( + nullary("dump", "displays a view of the interpreter's internal state", dumpCommand), + cmd("phase", "<phase>", "set the implicit phase for power commands", phaseCommand), + cmd("wrap", "<method>", "name of method to wrap around each repl line", wrapCommand) withLongHelp (""" + |:wrap + |:wrap <method> + | + |Installs a wrapper around each line entered into the repl. + |Currently it must be the simple name of an existing method + |with the specific signature shown in the following example. + | + |def timed[T](body: => T): T = { + | val start = System.nanoTime + | try body + | finally println((System.nanoTime - start) + " nanos elapsed.") + |} + |:wrap timed + | + |If given no argument, :wrap removes any wrapper present. + |Note that wrappers do not compose (a new one replaces the old + |one) and also that the :phase command uses the same machinery, + |so setting :wrap will clear any :phase setting. + """.stripMargin.trim) + ) - private def dumpCommand(line: String): Result = { - println(power) - history.asStrings takeRight 30 foreach println + private def dumpCommand(): Result = { + echo("" + power) + history.asStrings takeRight 30 foreach echo in.redrawLine() } @@ -245,6 +302,31 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) "scala.runtime." -> "runtime." ) + private def importsCommand(line: String): Result = { + val tokens = words(line) + val handlers = intp.languageWildcardHandlers ++ intp.importHandlers + val isVerbose = tokens contains "-v" + + handlers.filterNot(_.importedSymbols.isEmpty).zipWithIndex foreach { + case (handler, idx) => + val (types, terms) = handler.importedSymbols partition (_.name.isTypeName) + val imps = handler.implicitSymbols + val found = tokens filter (handler importsSymbolNamed _) + val typeMsg = if (types.isEmpty) "" else types.size + " types" + val termMsg = if (terms.isEmpty) "" else terms.size + " terms" + val implicitMsg = if (imps.isEmpty) "" else imps.size + " are implicit" + val foundMsg = if (found.isEmpty) "" else found.mkString(" // imports: ", ", ", "") + val statsMsg = List(typeMsg, termMsg, implicitMsg) filterNot (_ == "") mkString ("(", ", ", ")") + + intp.reporter.printMessage("%2d) %-30s %s%s".format( + idx + 1, + handler.importString, + statsMsg, + foundMsg + )) + } + } + private def implicitsCommand(line: String): Result = { val intp = ILoop.this.intp import intp._ @@ -303,19 +385,22 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } } - private object javap extends Javap(intp.classLoader, new IMain.ReplStrippingWriter(intp)) { + protected def newJavap() = new Javap(intp.classLoader, new IMain.ReplStrippingWriter(intp)) { override def tryClass(path: String): Array[Byte] = { // Look for Foo first, then Foo$, but if Foo$ is given explicitly, // we have to drop the $ to find object Foo, then tack it back onto // the end of the flattened name. - def className = intp pathToFlatName path - def moduleName = (intp pathToFlatName path.stripSuffix("$")) + "$" + def className = intp flatName path + def moduleName = (intp flatName path.stripSuffix("$")) + "$" val bytes = super.tryClass(className) if (bytes.nonEmpty) bytes else super.tryClass(moduleName) } } + private lazy val javap = + try newJavap() + catch { case _: Exception => null } private def typeCommand(line: String): Result = { intp.typeOfExpression(line) match { @@ -325,6 +410,8 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } private def javapCommand(line: String): Result = { + if (javap == null) + return ":javap unavailable on this platform." if (line == "") return ":javap [-lcsvp] [path1 path2 ...]" @@ -333,20 +420,39 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) else res.show() } } - private def keybindingsCommand(line: String): Result = { + private def keybindingsCommand(): Result = { if (in.keyBindings.isEmpty) "Key bindings unavailable." else { - println("Reading jline properties for default key bindings.") - println("Accuracy not guaranteed: treat this as a guideline only.\n") - in.keyBindings foreach println + echo("Reading jline properties for default key bindings.") + echo("Accuracy not guaranteed: treat this as a guideline only.\n") + in.keyBindings foreach (x => echo ("" + x)) } } private def wrapCommand(line: String): Result = { - intp setExecutionWrapper line - if (line == "") "Cleared wrapper." - else "Set wrapper to '" + line + "'" + def failMsg = "Argument to :wrap must be the name of a method with signature [T](=> T): T" + val intp = ILoop.this.intp + val g: intp.global.type = intp.global + import g._ + + words(line) match { + case Nil => + intp setExecutionWrapper "" + "Cleared wrapper." + case wrapper :: Nil => + intp.typeOfExpression(wrapper) match { + case Some(PolyType(List(targ), MethodType(List(arg), restpe))) => + intp setExecutionWrapper intp.pathToTerm(wrapper) + "Set wrapper to '" + wrapper + "'" + case Some(x) => + failMsg + "\nFound: " + x + case _ => + failMsg + "\nFound: <unknown>" + } + case _ => failMsg + } } - private def pathToPhased = intp.pathToTerm("power") + ".phased" + + private def pathToPhaseWrapper = intp.pathToTerm("$r") + ".phased.atCurrent" private def phaseCommand(name: String): Result = { // This line crashes us in TreeGen: // @@ -377,7 +483,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) if (what.isEmpty || !phased.set(what)) "'" + name + "' does not appear to represent a valid phase." else { - intp.setExecutionWrapper(pathToPhased) + intp.setExecutionWrapper(pathToPhaseWrapper) val activeMessage = if (what.toString.length == name.length) "" + what else "%s (%s)".format(what, name) @@ -402,28 +508,24 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) case ex: Throwable => if (settings.YrichExes.value) { val sources = implicitly[Sources] - out.println("\n" + ex.getMessage) - out.println( + echo("\n" + ex.getMessage) + echo( if (isReplDebug) "[searching " + sources.path + " for exception contexts...]" else "[searching for exception contexts...]" ) - out.println(Exceptional(ex).force().context()) + echo(Exceptional(ex).force().context()) } else { - out.println(util.stackTraceString(ex)) + echo(util.stackTraceString(ex)) } ex match { case _: NoSuchMethodError | _: NoClassDefFoundError => - out.println("Unrecoverable error.") + echo("Unrecoverable error.") throw ex case _ => - out.print(replayQuestionMessage) - out.flush() - if (in.readAssumingNo("")) { - out.println("\nAttempting session recovery with replay.") - replay() - } - else out.println("\nAbandoning crashed session.") + def fn(): Boolean = in.readYesOrNo(replayQuestionMessage, { echo("\nYou must enter y or n.") ; fn() }) + if (fn()) replay() + else echo("\nAbandoning crashed session.") } } @@ -458,7 +560,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) try file applyReader { reader => in = SimpleReader(reader, out, false) - plushln("Loading " + file + "...") + echo("Loading " + file + "...") loop() } finally { @@ -472,33 +574,32 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) closeInterpreter() createInterpreter() for (cmd <- replayCommands) { - plushln("Replaying: " + cmd) // flush because maybe cmd will have its own output + echo("Replaying: " + cmd) // flush because maybe cmd will have its own output command(cmd) - out.println + echo("") } } /** fork a shell and run a command */ - def shCommand(cmd: String): Result = { - if (cmd == "") - return "Usage: sh <command line>" - - intp quietRun "import _root_.scala.sys.process._" - val pb = Process(cmd) - intp.bind("builder", pb) - val stdout = Process(cmd).lines - intp.bind("stdout", stdout) - () + lazy val shCommand = new LoopCommand("sh", "run a shell command (result is implicitly => List[String])") { + override def usage = "<command line>" + def apply(line: String): Result = line match { + case "" => showUsage() + case _ => + val toRun = classOf[ProcessResult].getName + "(" + string2codeQuoted(line) + ")" + intp interpret toRun + () + } } def withFile(filename: String)(action: File => Unit) { val f = File(filename) if (f.exists) action(f) - else out.println("That file does not exist") + else echo("That file does not exist") } - def load(arg: String) = { + def loadCommand(arg: String) = { var shouldReplay: Option[String] = None withFile(arg)(f => { interpretAllFrom(f) @@ -512,61 +613,41 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) if (f.exists) { addedClasspath = ClassPath.join(addedClasspath, f.path) val totalClasspath = ClassPath.join(settings.classpath.value, addedClasspath) - println("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath)) + echo("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath)) replay() } - else out.println("The path '" + f + "' doesn't seem to exist.") + else echo("The path '" + f + "' doesn't seem to exist.") } def powerCmd(): Result = { - if (isReplPower) return "Already in power mode." + if (isReplPower) "Already in power mode." else enablePowerMode() } def enablePowerMode() = { - isReplPower = true + replProps.power setValue true power.unleash() - out.println(power.banner) + echo(power.banner) } def verbosity() = { val old = intp.printResults intp.printResults = !old - out.println("Switched " + (if (old) "off" else "on") + " result printing.") + echo("Switched " + (if (old) "off" else "on") + " result printing.") } /** Run one command submitted by the user. Two values are returned: * (1) whether to keep running, (2) the line to record for replay, * if any. */ def command(line: String): Result = { - def withError(msg: String) = { - out println msg - Result(true, None) - } - def ambiguous(cmds: List[LoopCommand]) = "Ambiguous: did you mean " + cmds.map(":" + _.name).mkString(" or ") + "?" - - // not a command - if (!line.startsWith(":")) { - // Notice failure to create compiler - if (intp.global == null) return Result(false, None) - else return Result(true, interpretStartingWith(line)) - } - - val tokens = (line drop 1 split """\s+""").toList - if (tokens.isEmpty) - return withError(ambiguous(commands)) - - val (cmd :: args) = tokens - - // this lets us add commands willy-nilly and only requires enough command to disambiguate - commands.filter(_.name startsWith cmd) match { - case List(x) => x(args) - case Nil => withError("Unknown command. Type :help for help.") - case xs => - xs find (_.name == cmd) match { - case Some(exact) => exact(args) - case _ => withError(ambiguous(xs)) - } + if (line startsWith ":") { + val cmd = line.tail takeWhile (x => !x.isWhitespace) + uniqueCommand(cmd) match { + case Some(lc) => lc(line.tail stripPrefix cmd dropWhile (_.isWhitespace)) + case _ => ambiguousError(cmd) + } } + else if (intp.global == null) Result(false, None) // Notice failure to create compiler + else Result(true, interpretStartingWith(line)) } private def readWhile(cond: String => Boolean) = { @@ -574,10 +655,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } def pasteCommand(): Result = { - out.println("// Entering paste mode (ctrl-D to finish)\n") - out.flush() + echo("// Entering paste mode (ctrl-D to finish)\n") val code = readWhile(_ => true) mkString "\n" - out.println("\n// Exiting paste mode, now interpreting.\n") + echo("\n// Exiting paste mode, now interpreting.\n") intp interpret code () } @@ -587,13 +667,19 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) val PromptString = "scala> " def interpret(line: String): Unit = { - out.println(line.trim) + echo(line.trim) intp interpret line - out.println("") + echo("") } - def transcript(start: String) = + def transcript(start: String) = { + // Printing this message doesn't work very well becaues it's buried in the + // transcript they just pasted. Todo: a short timer goes off when + // lines stop coming which tells them to hit ctrl-D. + // + // echo("// Detected repl transcript paste: ctrl-D to finish.") apply(Iterator(start) ++ readWhile(_.trim != PromptString.trim)) + } } import paste.{ ContinueString, PromptString } @@ -614,7 +700,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) case IR.Success => Some(code) case IR.Incomplete => if (in.interactive && code.endsWith("\n\n")) { - out.println("You typed two blank lines. Starting a new command.") + echo("You typed two blank lines. Starting a new command.") None } else in.readLine(ContinueString) match { @@ -641,7 +727,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) * and avoid the interpreter, as it's likely not valid scala code. */ if (code == "") None - else if (!paste.running && code.startsWith(PromptString)) { + else if (!paste.running && code.trim.startsWith(PromptString)) { paste.transcript(code) None } @@ -679,7 +765,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) val cmd = ":load " + filename command(cmd) addReplay(cmd) - out.println() + echo("") } case _ => } @@ -696,7 +782,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) else new JLineCompletion(intp) ) catch { - case _: Exception | _: NoClassDefFoundError => SimpleReader() + case ex @ (_: Exception | _: NoClassDefFoundError) => + echo("Failed to created JLineReader: " + ex + "\nFalling back to SimpleReader.") + SimpleReader() } } @@ -724,7 +812,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) // they type a command the compiler is ready to roll. intp.initialize() if (isReplPower) { - plushln("Starting in power mode, one moment...\n") + echo("Starting in power mode, one moment...\n") enablePowerMode() } loop() @@ -735,8 +823,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) /** process command-line arguments and do as they request */ def process(args: Array[String]): Boolean = { - def error1(msg: String) = out println ("scala: " + msg) - val command = new CommandLine(args.toList, error1) + val command = new CommandLine(args.toList, msg => echo("scala: " + msg)) def neededHelp(): String = (if (command.settings.help.value) command.usageMsg + "\n" else "") + (if (command.settings.Xhelp.value) command.xusageMsg + "\n" else "") @@ -744,7 +831,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) // if they asked for no help and command is valid, we call the real main neededHelp() match { case "" => command.ok && process(command.settings) - case help => plush(help) ; true + case help => echoNoNL(help) ; true } } @@ -761,11 +848,47 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) object ILoop { implicit def loopToInterpreter(repl: ILoop): IMain = repl.intp + private def echo(msg: String) = Console println msg + + // Designed primarily for use by test code: take a String with a + // bunch of code, and prints out a transcript of what it would look + // like if you'd just typed it into the repl. + def runForTranscript(code: String, settings: Settings): String = { + import java.io.{ BufferedReader, StringReader, OutputStreamWriter } + + stringFromStream { ostream => + Console.withOut(ostream) { + val output = new PrintWriter(new OutputStreamWriter(ostream), true) { + override def write(str: String) = { + // completely skip continuation lines + if (str forall (ch => ch.isWhitespace || ch == '|')) () + // print a newline on empty scala prompts + else if ((str contains '\n') && (str.trim == "scala> ")) super.write("\n") + else super.write(str) + } + } + val input = new BufferedReader(new StringReader(code)) { + override def readLine(): String = { + val s = super.readLine() + // helping out by printing the line being interpreted. + if (s != null) + output.println(s) + s + } + } + val repl = new ILoop(input, output) + if (settings.classpath.isDefault) + settings.classpath.value = sys.props("java.class.path") + + repl process settings + } + } + } /** Creates an interpreter loop with default settings and feeds * the given code to it as input. */ - def run(code: String): String = { + def run(code: String, sets: Settings = new Settings): String = { import java.io.{ BufferedReader, StringReader, OutputStreamWriter } stringFromStream { ostream => @@ -773,10 +896,11 @@ object ILoop { val input = new BufferedReader(new StringReader(code)) val output = new PrintWriter(new OutputStreamWriter(ostream), true) val repl = new ILoop(input, output) - val settings = new Settings - settings.classpath.value = sys.props("java.class.path") - repl process settings + if (sets.classpath.isDefault) + sets.classpath.value = sys.props("java.class.path") + + repl process sets } } } @@ -792,11 +916,11 @@ object ILoop { val msg = if (args.isEmpty) "" else " Binding " + args.size + " value%s.".format( if (args.size == 1) "" else "s" ) - Console.println("Debug repl starting." + msg) + echo("Debug repl starting." + msg) val repl = new ILoop { override def prompt = "\ndebug> " } - repl.settings = new Settings(Console println _) + repl.settings = new Settings(echo) repl.settings.embeddedDefaults[T] repl.createInterpreter() repl.in = JLineReader(repl) @@ -806,7 +930,7 @@ object ILoop { args foreach (p => repl.bind(p.name, p.tpe, p.value)) repl.loop() - Console.println("\nDebug repl exiting.") + echo("\nDebug repl exiting.") repl.closeInterpreter() } } diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala index d74aa5e6df..62e781958f 100644 --- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala +++ b/src/compiler/scala/tools/nsc/interpreter/IMain.scala @@ -11,7 +11,7 @@ import java.io.{ PrintWriter } import java.lang.reflect import java.net.URL import util.{ Set => _, _ } -import io.VirtualDirectory +import io.{ AbstractFile, VirtualDirectory } import reporters.{ ConsoleReporter, Reporter } import symtab.{ Flags, Names } import scala.tools.nsc.interpreter.{ Results => IR } @@ -57,7 +57,7 @@ import IMain._ * @author Moez A. Abdel-Gawad * @author Lex Spoon */ -class IMain(val settings: Settings, protected val out: PrintWriter) { +class IMain(val settings: Settings, protected val out: PrintWriter) extends Imports { imain => /** construct an interpreter that reports to Console */ @@ -78,7 +78,16 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { import formatting._ /** directory to save .class files to */ - val virtualDirectory = new VirtualDirectory("(memory)", None) + val virtualDirectory = new VirtualDirectory("(memory)", None) { + private def pp(root: io.AbstractFile, indentLevel: Int) { + val spaces = " " * indentLevel + out.println(spaces + root.name) + if (root.isDirectory) + root.toList sortBy (_.name) foreach (x => pp(x, indentLevel + 1)) + } + // print the contents hierarchically + def show() = pp(this, 0) + } /** reporter */ lazy val reporter: ConsoleReporter = new IMain.ReplReporter(this) @@ -102,11 +111,8 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { private def _initialize(): Boolean = { val source = """ - |// this is assembled to force the loading of approximately the - |// classes which will be loaded on the first expression anyway. |class $repl_$init { - | val x = "abc".reverse.length + (5 max 5) - | scala.runtime.ScalaRunTime.stringOf(x) + | List(1) map (_ + 1) |} |""".stripMargin @@ -157,11 +163,9 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { else null } @deprecated("Use `global` for access to the compiler instance.") - lazy val compiler = global + lazy val compiler: global.type = global import global._ - import definitions.{ ScalaPackage, JavaLangPackage, PredefModule, RootClass } - import nme.{ INTERPRETER_IMPORT_WRAPPER } object naming extends { val global: imain.global.type = imain.global @@ -268,9 +272,21 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { if (parentClassLoader == null) ScalaClassLoader fromURLs compilerClasspath else new URLClassLoader(compilerClasspath, parentClassLoader) - new AbstractFileClassLoader(virtualDirectory, parent) + new AbstractFileClassLoader(virtualDirectory, parent) { + /** Overridden here to try translating a simple name to the generated + * class name if the original attempt fails. This method is used by + * getResourceAsStream as well as findClass. + */ + override protected def findAbstractFile(name: String): AbstractFile = { + super.findAbstractFile(name) match { + // deadlocks on startup if we try to translate names too early + case null if isInitializeComplete => generatedName(name) map (x => super.findAbstractFile(x)) orNull + case file => file + } + } + } } - private def loadByName(s: String): Class[_] = + private def loadByName(s: String): JClass = (classLoader tryToInitializeClass s) getOrElse sys.error("Failed to load expected class: '" + s + "'") protected def parentClassLoader: ClassLoader = @@ -286,12 +302,12 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { * * $line19.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$Bippy */ - def pathToFlatName(id: String): String = { - requestForIdent(id) match { - case Some(req) => req fullFlatName id - case _ => id - } + def generatedName(simpleName: String): Option[String] = { + if (simpleName endsWith "$") optFlatName(simpleName.init) map (_ + "$") + else optFlatName(simpleName) } + def flatName(id: String) = optFlatName(id) getOrElse id + def optFlatName(id: String) = requestForIdent(id) map (_ fullFlatName id) def allDefinedNames = definedNameMap.keys.toList sortBy (_.toString) def pathToType(id: String): String = pathToName(newTypeName(id)) @@ -336,6 +352,22 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { prevRequests += req req.referencedNames foreach (x => referencedNameMap(x) = req) + // warning about serially defining companions. It'd be easy + // enough to just redefine them together but that may not always + // be what people want so I'm waiting until I can do it better. + if (!settings.nowarnings.value) { + for { + name <- req.definedNames filterNot (x => req.definedNames contains x.companionName) + oldReq <- definedNameMap get name.companionName + newSym <- req.definedSymbols get name + oldSym <- oldReq.definedSymbols get name.companionName + } { + printMessage("warning: previously defined %s is not a companion to %s.".format(oldSym, newSym)) + printMessage("Companions must be defined together; you may wish to use :paste mode for this.") + } + } + + // Updating the defined name map req.definedNames foreach { name => if (definedNameMap contains name) { if (name.isTypeName) handleTypeRedefinition(name.toTypeName, definedNameMap(name), req) @@ -345,114 +377,6 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { } } - /** Compute imports that allow definitions from previous - * requests to be visible in a new request. Returns - * three pieces of related code: - * - * 1. An initial code fragment that should go before - * the code of the new request. - * - * 2. A code fragment that should go after the code - * of the new request. - * - * 3. An access path which can be traverested to access - * any bindings inside code wrapped by #1 and #2 . - * - * The argument is a set of Names that need to be imported. - * - * Limitations: This method is not as precise as it could be. - * (1) It does not process wildcard imports to see what exactly - * they import. - * (2) If it imports any names from a request, it imports all - * of them, which is not really necessary. - * (3) It imports multiple same-named implicits, but only the - * last one imported is actually usable. - */ - private case class ComputedImports(prepend: String, append: String, access: String) - private def importsCode(wanted: Set[Name]): ComputedImports = { - /** Narrow down the list of requests from which imports - * should be taken. Removes requests which cannot contribute - * useful imports for the specified set of wanted names. - */ - case class ReqAndHandler(req: Request, handler: MemberHandler) { } - - def reqsToUse: List[ReqAndHandler] = { - /** Loop through a list of MemberHandlers and select which ones to keep. - * 'wanted' is the set of names that need to be imported. - */ - def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = { - val isWanted = wanted contains _ - // Single symbol imports might be implicits! See bug #1752. Rather than - // try to finesse this, we will mimic all imports for now. - def keepHandler(handler: MemberHandler) = handler match { - case _: ImportHandler => true - case x => x.definesImplicit || (x.definedNames exists isWanted) - } - - reqs match { - case Nil => Nil - case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted) - case rh :: rest => - import rh.handler._ - val newWanted = wanted ++ referencedNames -- definedNames -- importedNames - rh :: select(rest, newWanted) - } - } - - /** Flatten the handlers out and pair each with the original request */ - select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse - } - - val code, trailingBraces, accessPath = new StringBuilder - val currentImps = mutable.HashSet[Name]() - - // add code for a new object to hold some imports - def addWrapper() { - val impname = INTERPRETER_IMPORT_WRAPPER - code append "object %s {\n".format(impname) - trailingBraces append "}\n" - accessPath append ("." + impname) - - currentImps.clear - } - - addWrapper() - - // loop through previous requests, adding imports for each one - for (ReqAndHandler(req, handler) <- reqsToUse) { - handler match { - // If the user entered an import, then just use it; add an import wrapping - // level if the import might conflict with some other import - case x: ImportHandler => - if (x.importsWildcard || (currentImps exists (x.importedNames contains _))) - addWrapper() - - code append (x.member + "\n") - - // give wildcard imports a import wrapper all to their own - if (x.importsWildcard) addWrapper() - else currentImps ++= x.importedNames - - // For other requests, import each defined name. - // import them explicitly instead of with _, so that - // ambiguity errors will not be generated. Also, quote - // the name of the variable, so that we don't need to - // handle quoting keywords separately. - case x => - for (imv <- x.definedNames) { - if (currentImps contains imv) addWrapper() - - code append ("import %s\n" format (req fullPath imv)) - currentImps += imv - } - } - } - // add one extra wrapper, to prevent warnings in the common case of - // redefining the value bound in the last interpreter request. - addWrapper() - ComputedImports(code.toString, trailingBraces.toString, accessPath.toString) - } - /** Parse a line into a sequence of trees. Returns None if the input is incomplete. */ def parse(line: String): Option[List[Tree]] = { var justNeedsMore = false @@ -497,7 +421,6 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { def compileString(code: String): Boolean = compileSources(new BatchSourceFile("<script>", code)) - /** Build a request from the user. `trees` is `line` after being parsed. */ private def buildRequest(line: String, trees: List[Tree]): Request = new Request(line, trees) @@ -627,14 +550,14 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { virtualDirectory.clear() resetClassLoader() resetAllCreators() - prevRequests.clear + prevRequests.clear() } /** This instance is no longer needed, so release any resources * it is using. The reporter's output gets flushed. */ def close() { - reporter.flush + reporter.flush() } /** Here is where we: @@ -862,8 +785,10 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { // lazy val definedTypes: Map[Name, Type] = { // typeNames map (x => x -> afterTyper(resultSymbol.info.nonPrivateDecl(x).tpe)) toMap // } - lazy val definedSymbols: Map[Name, Symbol] = - termNames map (x => x -> applyToResultMember(x, x => x)) toMap + lazy val definedSymbols: Map[Name, Symbol] = ( + termNames.map(x => x -> applyToResultMember(x, x => x)) ++ + typeNames.map(x => x -> compilerTypeOf.get(x).map(_.typeSymbol).getOrElse(NoSymbol)) + ).toMap lazy val typesOfDefinedTerms: Map[Name, Type] = termNames map (x => x -> applyToResultMember(x, _.tpe)) toMap @@ -905,7 +830,13 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { execution.state match { case Done => ("" + execution.get(), true) - case Threw => if (bindLastException) handleException(execution.caught()) else throw execution.caught() + case Threw => + val ex = execution.caught() + if (isReplDebug) + ex.printStackTrace() + + if (bindLastException) handleException(ex) + else throw ex case Cancelled => ("Execution interrupted by signal.\n", false) case Running => ("Execution still running! Seems impossible.", false) } @@ -929,8 +860,10 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { case _ => naming.mostRecentVar }) - private def requestForName(name: Name): Option[Request] = + private def requestForName(name: Name): Option[Request] = { + assert(definedNameMap != null, "definedNameMap is null") definedNameMap get name + } private def requestForIdent(line: String): Option[Request] = requestForName(newTermName(line)) orElse requestForName(newTypeName(line)) @@ -948,22 +881,21 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { requestForName(name) flatMap { req => req.handlers find (_.definedNames contains name) } - // def valueOfTerm(id: String): Option[AnyRef] = requestForIdent(id) flatMap (_.getEval) - def classOfTerm(id: String): Option[Class[_]] = + def classOfTerm(id: String): Option[JClass] = valueOfTerm(id) map (_.getClass) def typeOfTerm(id: String): Option[Type] = newTermName(id) match { - case nme.ROOTPKG => Some(RootClass.tpe) + case nme.ROOTPKG => Some(definitions.RootClass.tpe) case name => requestForName(name) flatMap (_.compilerTypeOf get name) } def symbolOfTerm(id: String): Symbol = requestForIdent(id) flatMap (_.definedSymbols get newTermName(id)) getOrElse NoSymbol - def runtimeClassAndTypeOfTerm(id: String): Option[(Class[_], Type)] = { + def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Type)] = { for { clazz <- classOfTerm(id) tpe <- runtimeTypeOfTerm(id) @@ -997,17 +929,23 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { return None } + def asQualifiedImport = { + val name = expr.takeWhile(_ != '.') + importedTermNamed(name) flatMap { sym => + typeOfExpression(sym.fullName + expr.drop(name.length)) + } + } def asModule = safeModule(expr) map (_.tpe) def asExpr = beSilentDuring { val lhs = freshInternalVarName() - interpret("lazy val " + lhs + " = { " + expr + " } ") match { + interpret("lazy val " + lhs + " = { " + expr + " } ", true) match { case IR.Success => typeOfExpression(lhs) case _ => None } } typeOfExpressionDepth += 1 - try typeOfTerm(expr) orElse asModule orElse asExpr + try typeOfTerm(expr) orElse asModule orElse asExpr orElse asQualifiedImport finally typeOfExpressionDepth -= 1 } // def compileAndTypeExpr(expr: String): Option[Typer] = { @@ -1016,70 +954,22 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { // } // } - private def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x } - private def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x } + protected def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x } + protected def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x } - def importHandlers = allHandlers collect { case x: ImportHandler => x } def definedTerms = onlyTerms(allDefinedNames) filterNot isInternalVarName def definedTypes = onlyTypes(allDefinedNames) - def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames)) - def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames)) + def definedSymbols = prevRequests.toSet flatMap ((x: Request) => x.definedSymbols.values) /** the previous requests this interpreter has processed */ - private lazy val prevRequests = mutable.ArrayBuffer[Request]() + private lazy val prevRequests = mutable.ListBuffer[Request]() private lazy val referencedNameMap = mutable.Map[Name, Request]() private lazy val definedNameMap = mutable.Map[Name, Request]() - private def allHandlers = prevRequests.toList flatMap (_.handlers) - private def allReqAndHandlers = prevRequests.toList flatMap (req => req.handlers map (req -> _)) - def allSeenTypes = prevRequests.toList flatMap (_.typeOf.values.toList) distinct + protected def prevRequestList = prevRequests.toList + private def allHandlers = prevRequestList flatMap (_.handlers) + def allSeenTypes = prevRequestList flatMap (_.typeOf.values.toList) distinct def allImplicits = allHandlers filter (_.definesImplicit) flatMap (_.definedNames) - - private def membersAtPickler(sym: Symbol): List[Symbol] = - atPickler(sym.info.nonPrivateMembers) - - /** Symbols whose contents are language-defined to be imported. */ - def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule) - def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe) - - /** Types which have been wildcard imported, such as: - * val x = "abc" ; import x._ // type java.lang.String - * import java.lang.String._ // object java.lang.String - * - * Used by tab completion. - * - * XXX right now this gets import x._ and import java.lang.String._, - * but doesn't figure out import String._. There's a lot of ad hoc - * scope twiddling which should be swept away in favor of digging - * into the compiler scopes. - */ - def sessionWildcards: List[Type] = { - importHandlers flatMap { - case x if x.importsWildcard => x.targetType - case _ => None - } distinct - } - def wildcardTypes = languageWildcards ++ sessionWildcards - - def languageSymbols = languageWildcardSyms flatMap membersAtPickler - def sessionSymbols = importHandlers flatMap (_.importedSymbols) - def importedSymbols = languageSymbols ++ sessionSymbols - def implicitSymbols = importedSymbols filter (_.isImplicit) - - /** Tuples of (source, imported symbols) in the order they were imported. - */ - def importedSymbolsBySource: List[(Symbol, List[Symbol])] = { - val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym))) - val session = importHandlers filter (_.targetType.isDefined) map { mh => - (mh.targetType.get.typeSymbol, mh.importedSymbols) - } - - lang ++ session - } - def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = { - importedSymbolsBySource map { - case (k, vs) => (k, vs filter (_.isImplicit)) - } filterNot (_._2.isEmpty) - } + def importHandlers = allHandlers collect { case x: ImportHandler => x } def visibleTermNames: List[Name] = definedTerms ++ importedTerms distinct @@ -1141,7 +1031,7 @@ object IMain { def apply(contributors: List[T]): String = stringFromWriter { code => code println preamble - contributors map generate foreach (code print _) + contributors map generate foreach (code println _) code println postamble } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Imports.scala b/src/compiler/scala/tools/nsc/interpreter/Imports.scala new file mode 100644 index 0000000000..b2706330e7 --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/Imports.scala @@ -0,0 +1,194 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import scala.collection.{ mutable, immutable } + +trait Imports { + self: IMain => + + import global._ + import definitions.{ ScalaPackage, JavaLangPackage, PredefModule } + import memberHandlers._ + + /** Synthetic import handlers for the language defined imports. */ + private def makeWildcardImportHandler(sym: Symbol): ImportHandler = { + val hd :: tl = sym.fullName.split('.').toList map newTermName + val tree = Import( + tl.foldLeft(Ident(hd): Tree)((x, y) => Select(x, y)), + List(ImportSelector(nme.WILDCARD, -1, null, -1)) + ) + tree setSymbol sym + new ImportHandler(tree) + } + + /** Symbols whose contents are language-defined to be imported. */ + def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule) + def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe) + def languageWildcardHandlers = languageWildcardSyms map makeWildcardImportHandler + + def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames)) + def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames)) + + /** Types which have been wildcard imported, such as: + * val x = "abc" ; import x._ // type java.lang.String + * import java.lang.String._ // object java.lang.String + * + * Used by tab completion. + * + * XXX right now this gets import x._ and import java.lang.String._, + * but doesn't figure out import String._. There's a lot of ad hoc + * scope twiddling which should be swept away in favor of digging + * into the compiler scopes. + */ + def sessionWildcards: List[Type] = { + importHandlers flatMap { + case x if x.importsWildcard => x.targetType + case _ => None + } distinct + } + def wildcardTypes = languageWildcards ++ sessionWildcards + + def languageSymbols = languageWildcardSyms flatMap membersAtPickler + def sessionImportedSymbols = importHandlers flatMap (_.importedSymbols) + def importedSymbols = languageSymbols ++ sessionImportedSymbols + def importedTermSymbols = importedSymbols collect { case x: TermSymbol => x } + def importedTypeSymbols = importedSymbols collect { case x: TypeSymbol => x } + def implicitSymbols = importedSymbols filter (_.isImplicit) + + def importedTermNamed(name: String) = importedTermSymbols find (_.name.toString == name) + + /** Tuples of (source, imported symbols) in the order they were imported. + */ + def importedSymbolsBySource: List[(Symbol, List[Symbol])] = { + val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym))) + val session = importHandlers filter (_.targetType.isDefined) map { mh => + (mh.targetType.get.typeSymbol, mh.importedSymbols) + } + + lang ++ session + } + def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = { + importedSymbolsBySource map { + case (k, vs) => (k, vs filter (_.isImplicit)) + } filterNot (_._2.isEmpty) + } + + /** Compute imports that allow definitions from previous + * requests to be visible in a new request. Returns + * three pieces of related code: + * + * 1. An initial code fragment that should go before + * the code of the new request. + * + * 2. A code fragment that should go after the code + * of the new request. + * + * 3. An access path which can be traverested to access + * any bindings inside code wrapped by #1 and #2 . + * + * The argument is a set of Names that need to be imported. + * + * Limitations: This method is not as precise as it could be. + * (1) It does not process wildcard imports to see what exactly + * they import. + * (2) If it imports any names from a request, it imports all + * of them, which is not really necessary. + * (3) It imports multiple same-named implicits, but only the + * last one imported is actually usable. + */ + case class ComputedImports(prepend: String, append: String, access: String) + protected def importsCode(wanted: Set[Name]): ComputedImports = { + /** Narrow down the list of requests from which imports + * should be taken. Removes requests which cannot contribute + * useful imports for the specified set of wanted names. + */ + case class ReqAndHandler(req: Request, handler: MemberHandler) { } + + def reqsToUse: List[ReqAndHandler] = { + /** Loop through a list of MemberHandlers and select which ones to keep. + * 'wanted' is the set of names that need to be imported. + */ + def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = { + val isWanted = wanted contains _ + // Single symbol imports might be implicits! See bug #1752. Rather than + // try to finesse this, we will mimic all imports for now. + def keepHandler(handler: MemberHandler) = handler match { + case _: ImportHandler => true + case x => x.definesImplicit || (x.definedNames exists isWanted) + } + + reqs match { + case Nil => Nil + case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted) + case rh :: rest => + import rh.handler._ + val newWanted = wanted ++ referencedNames -- definedNames -- importedNames + rh :: select(rest, newWanted) + } + } + + /** Flatten the handlers out and pair each with the original request */ + select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse + } + + val code, trailingBraces, accessPath = new StringBuilder + val currentImps = mutable.HashSet[Name]() + + // add code for a new object to hold some imports + def addWrapper() { + val impname = nme.INTERPRETER_IMPORT_WRAPPER + code append "object %s {\n".format(impname) + trailingBraces append "}\n" + accessPath append ("." + impname) + + currentImps.clear + } + + addWrapper() + + // loop through previous requests, adding imports for each one + for (ReqAndHandler(req, handler) <- reqsToUse) { + handler match { + // If the user entered an import, then just use it; add an import wrapping + // level if the import might conflict with some other import + case x: ImportHandler => + if (x.importsWildcard || (currentImps exists (x.importedNames contains _))) + addWrapper() + + code append (x.member + "\n") + + // give wildcard imports a import wrapper all to their own + if (x.importsWildcard) addWrapper() + else currentImps ++= x.importedNames + + // For other requests, import each defined name. + // import them explicitly instead of with _, so that + // ambiguity errors will not be generated. Also, quote + // the name of the variable, so that we don't need to + // handle quoting keywords separately. + case x => + for (imv <- x.definedNames) { + if (currentImps contains imv) addWrapper() + + code append ("import %s\n" format (req fullPath imv)) + currentImps += imv + } + } + } + // add one extra wrapper, to prevent warnings in the common case of + // redefining the value bound in the last interpreter request. + addWrapper() + ComputedImports(code.toString, trailingBraces.toString, accessPath.toString) + } + + private def allReqAndHandlers = + prevRequestList flatMap (req => req.handlers map (req -> _)) + + private def membersAtPickler(sym: Symbol): List[Symbol] = + atPickler(sym.info.nonPrivateMembers) +}
\ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala index 1430cbe55c..edade4da1b 100644 --- a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala @@ -27,12 +27,13 @@ trait InteractiveReader { def redrawLine(): Unit def currentLine: String - def readYesOrNo(prompt: String) = readOneKey(prompt) match { + def readYesOrNo(prompt: String, alt: => Boolean): Boolean = readOneKey(prompt) match { case 'y' => true case 'n' => false + case _ => alt } - def readAssumingNo(prompt: String) = try readYesOrNo(prompt) catch { case _: MatchError => false } - def readAssumingYes(prompt: String) = try readYesOrNo(prompt) catch { case _: MatchError => true } + def readAssumingNo(prompt: String) = readYesOrNo(prompt, false) + def readAssumingYes(prompt: String) = readYesOrNo(prompt, true) protected def readOneLine(prompt: String): String protected def readOneKey(prompt: String): Int diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala index 7430406306..b7baea57fc 100644 --- a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala +++ b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala @@ -102,7 +102,9 @@ class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput def excludeStartsWith: List[String] = List("<") // <byname>, <repeated>, etc. def excludeNames: List[String] = (anyref.methodNames filterNot anyRefMethodsToShow) :+ "_root_" - def methodSignatureString(sym: Symbol) = afterTyper(new MethodSymbolOutput(sym).methodString()) + def methodSignatureString(sym: Symbol) = { + IMain stripString afterTyper(new MethodSymbolOutput(sym).methodString()) + } def exclude(name: String): Boolean = ( (name contains "$") || diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala index d9260427b3..d222a80196 100644 --- a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala @@ -6,7 +6,6 @@ package scala.tools.nsc package interpreter -import java.io.File import scala.tools.jline.console.ConsoleReader import scala.tools.jline.console.completer._ import session._ diff --git a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala index 24fde9425f..196d8b882f 100644 --- a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala +++ b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala @@ -6,43 +6,87 @@ package scala.tools.nsc package interpreter +import collection.{ mutable, immutable } +import mutable.ListBuffer + +class ProcessResult(val line: String) { + import sys.process._ + private val buffer = new ListBuffer[String] + + val builder = Process(line) + val logger = ProcessLogger(buffer += _) + val exitCode = builder ! logger + def lines = buffer.toList + + def show() = lines foreach println + override def toString = "`%s` (%d lines, exit %d)".format(line, buffer.size, exitCode) +} +object ProcessResult { + implicit def processResultToOutputLines(pr: ProcessResult): List[String] = pr.lines + def apply(line: String): ProcessResult = new ProcessResult(line) +} + trait LoopCommands { protected def out: java.io.PrintWriter // a single interpreter command - sealed abstract class LoopCommand extends (List[String] => Result) { - def name: String - def help: String - def commandError(msg: String) = { - out.println(":" + name + " " + msg + ".") + abstract class LoopCommand(val name: String, val help: String) extends (String => Result) { + private var _longHelp: String = null + final def defaultHelp = usageMsg + " (no extended help available.)" + def hasLongHelp = _longHelp != null || longHelp != defaultHelp + def withLongHelp(text: String): this.type = { _longHelp = text ; this } + def longHelp = _longHelp match { + case null => defaultHelp + case text => text + } + def usage: String = "" + def usageMsg: String = ":" + name + ( + if (usage == "") "" else " " + usage + ) + def apply(line: String): Result + + // called if no args are given + def showUsage(): Result = { + "usage is " + usageMsg Result(true, None) } - def usage(): String + + def onError(msg: String) = { + out.println("error: " + msg) + showUsage() + } } - case class NoArgs(name: String, help: String, f: () => Result) extends LoopCommand { - def usage(): String = ":" + name - def apply(args: List[String]) = if (args.isEmpty) f() else commandError("accepts no arguments") + object LoopCommand { + def nullary(name: String, help: String, f: () => Result): LoopCommand = + new NullaryCmd(name, help, _ => f()) + + def cmd(name: String, usage: String, help: String, f: String => Result): LoopCommand = + if (usage == "") new NullaryCmd(name, help, f) + else new LineCmd(name, usage, help, f) + + def varargs(name: String, usage: String, help: String, f: List[String] => Result): LoopCommand = + new VarArgsCmd(name, usage, help, f) } - case class LineArg(name: String, help: String, f: (String) => Result) extends LoopCommand { - def usage(): String = ":" + name + " " - def apply(args: List[String]) = f(args mkString " ") + class NullaryCmd(name: String, help: String, f: String => Result) extends LoopCommand(name, help) { + def apply(line: String): Result = f(line) } - case class OneArg(name: String, help: String, f: (String) => Result) extends LoopCommand { - def usage(): String = ":" + name + " " - def apply(args: List[String]) = - if (args.size == 1) f(args.head) - else commandError("requires exactly one argument") + class LineCmd(name: String, argWord: String, help: String, f: String => Result) extends LoopCommand(name, help) { + override def usage = argWord + def apply(line: String): Result = f(line) } - case class VarArgs(name: String, help: String, f: (List[String]) => Result) extends LoopCommand { - def usage(): String = ":" + name + " [arg]" + class VarArgsCmd(name: String, argWord: String, help: String, f: List[String] => Result) + extends LoopCommand(name, help) { + override def usage = argWord + def apply(line: String): Result = apply(words(line)) def apply(args: List[String]) = f(args) } // the result of a single command case class Result(val keepRunning: Boolean, val lineToRecord: Option[String]) + object Result { // the default result means "keep running, and don't record that line" val default = Result(true, None) diff --git a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala index 29c31f50d6..330294f823 100644 --- a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala +++ b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala @@ -18,23 +18,6 @@ trait MemberHandlers { import global._ import naming._ - def string2codeQuoted(str: String) = "\"" + string2code(str) + "\"" - - /** Convert a string into code that can recreate the string. - * This requires replacing all special characters by escape - * codes. It does not add the surrounding " marks. */ - def string2code(str: String): String = { - val res = new StringBuilder - for (c <- str) c match { - case '"' | '\'' | '\\' => res += '\\' ; res += c - case _ if c.isControl => res ++= Chars.char2uescape(c) - case _ => res += c - } - res.toString - } - def any2stringOf(x: Any, maxlen: Int) = - "scala.runtime.ScalaRunTime.stringOf(%s, %s)".format(x, maxlen) - private def codegenln(leadingPlus: Boolean, xs: String*): String = codegen(leadingPlus, (xs ++ Array("\n")): _*) private def codegenln(xs: String*): String = codegenln(true, xs: _*) @@ -121,7 +104,6 @@ trait MemberHandlers { class ValHandler(member: ValDef) extends MemberDefHandler(member) { val maxStringElements = 1000 // no need to mkString billions of elements - def stringOf(x: Any) = any2stringOf(x, maxStringElements) override def definesValue = true override def resultExtractionCode(req: Request): String = { @@ -131,7 +113,7 @@ trait MemberHandlers { // if this is a lazy val we avoid evaluating it here val resultString = if (mods.isLazy) codegenln(false, "<lazy>") - else stringOf(req fullPath name) + else any2stringOf(req fullPath name, maxStringElements) """ + "%s: %s = " + %s""".format(prettyName, string2code(req typeOf name), resultString) } @@ -215,7 +197,9 @@ trait MemberHandlers { /** The names imported by this statement */ override lazy val importedNames: List[Name] = wildcardNames ++ individualNames + lazy val importsSymbolNamed: Set[String] = importedNames map (_.toString) toSet - override def resultExtractionCode(req: Request) = codegenln(imp.toString) + "\n" + def importString = imp.toString + override def resultExtractionCode(req: Request) = codegenln(importString) + "\n" } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala index e605bb010d..83321356a3 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala @@ -9,51 +9,93 @@ package interpreter /** If it looks like they're pasting in a scala interpreter * transcript, remove all the formatting we inserted so we * can make some sense of it. + * + * Most of the interesting code in here is due to my goal of + * "paste idempotence" i.e. the transcript resulting from pasting + * a transcript should itself be pasteable and should achieve + * the same result. */ abstract class Pasted { def ContinueString: String def PromptString: String def interpret(line: String): Unit - private var isRunning = false + def matchesPrompt(line: String) = matchesString(line, PromptString) + def matchesContinue(line: String) = matchesString(line, ContinueString) def running = isRunning + private def matchesString(line: String, target: String): Boolean = ( + (line startsWith target) || + (line.nonEmpty && " \t".toSet(line.head) && matchesString(line.tail, target)) + ) + private def stripString(line: String, target: String) = line indexOf target match { + case -1 => line + case idx => line drop (idx + target.length) + } + private var isRunning = false + private val resReference = """(?<!^)(res\d+)""".r + private val resCreation = """^\s*(res\d+):.*""".r + private val resAssign = """^val (res\d+).*""".r + + private class PasteAnalyzer(val lines: List[String]) { + val referenced = lines flatMap (resReference findAllIn _.trim.stripPrefix("res")) toSet + val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList + + /** If it's a prompt or continuation line, strip the formatting bits and + * assemble the code. Otherwise ship it off to be analyzed for res references + * and discarded. + */ + def append(code: String, line: String): String = + if (matchesPrompt(line)) code + "\n" + line + else if (matchesContinue(line)) code + "\n" + stripString(line, ContinueString) + else fixResRefs(code, line) + + /** If the line looks like + * res15: Int + * + * and the additional conditions hold that: + * 1) res15 is referenced from elsewhere in the transcript + * 2) the preceding repl line is not "val res15 = ..." because that + * indicates it has already been "val-ified" on a previous paste + * + * then we go back in time to the preceding scala> prompt and + * rewrite the line containing <expr> as + * val res15 = { <expr> } + * and the rest as they say is rewritten history. + * + * In all other cases, discard the line. + */ + def fixResRefs(code: String, line: String) = line match { + case resCreation(resName) if referenced(resName) => + code.lastIndexOf(PromptString) match { + case -1 => code + case idx => + val (str1, str2) = code splitAt (idx + PromptString.length) + str2 match { + case resAssign(`resName`) => code + case _ => "%sval %s = { %s }".format(str1, resName, str2) + } + } + case _ => code + } + + def run() { + println("// Replaying %d commands from transcript.\n" format cmds.size) + cmds foreach { cmd => + print(PromptString) + interpret(cmd) + } + } + } + /** Commands start on lines beginning with "scala>" and each successive * line which begins with the continuation string is appended to that command. * Everything else is discarded. When the end of the transcript is spotted, * all the commands are replayed. */ def apply(lines: TraversableOnce[String]) = { - val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList; - println("// Replaying %d commands from transcript.\n" format cmds.size) - isRunning = true - try cmds foreach interpret + try new PasteAnalyzer(lines.toList) run() finally isRunning = false } - - private def isPrompted(line: String) = line startsWith PromptString - private def isContinuation(line: String) = line startsWith ContinueString - - private def append(code: String, line: String): String = - if (isPrompted(line)) code + "\n" + line - else if (isContinuation(line)) code + "\n" + line.stripPrefix(ContinueString) - else fixResRefs(code, line) - - /** If the line looks like - * res15: Int - * then we go back in time to the preceding scala> prompt and rewrite - * the line containing <expr> as - * val res15 = { <expr> } - * and the rest as they say is rewritten history. - * - * In all other cases, discard the line. - */ - private val resRegex = """^(res\d+):.*""".r - private def fixResRefs(code: String, line: String) = line match { - case resRegex(resName) if code contains PromptString => - val (str1, str2) = code splitAt code.lastIndexOf(PromptString) + PromptString.length - "%sval %s = { %s }".format(str1, resName, str2) - case _ => code - } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Phased.scala b/src/compiler/scala/tools/nsc/interpreter/Phased.scala index 1406d2af39..b3d33325e4 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Phased.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Phased.scala @@ -6,6 +6,9 @@ package scala.tools.nsc package interpreter +import scala.collection.{ mutable, immutable } +import immutable.SortedMap + /** Mix this into an object and use it as a phasing * swiss army knife. */ @@ -63,11 +66,14 @@ trait Phased { try parseInternal(str) catch { case _: Exception => NoPhaseName } - def apply[T](body: => T): T = atPhase(get)(body) + def apply[T](body: => T): SortedMap[PhaseName, T] = + SortedMap[PhaseName, T](atMap(PhaseName.all)(body): _*) + + def atCurrent[T](body: => T): T = atPhase(get)(body) def multi[T](body: => T): Seq[T] = multi map (ph => at(ph)(body)) - def all[T](body: => T): Seq[T] = ats(PhaseName.all)(body) - def allshow[T](body: => T): Seq[T] = { - val pairs = atz(PhaseName.all)(body) + def all[T](body: => T): Seq[T] = atMulti(PhaseName.all)(body) + def show[T](body: => T): Seq[T] = { + val pairs = atMap(PhaseName.all)(body) pairs foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240)) } pairs map (_._2) } @@ -75,25 +81,27 @@ trait Phased { def at[T](ph: PhaseName)(body: => T): T = { val saved = get set(ph) - try apply(body) + try atCurrent(body) finally set(saved) } - def ats[T](phs: Seq[PhaseName])(body: => T): Seq[T] = { + def atMulti[T](phs: Seq[PhaseName])(body: => T): Seq[T] = { val saved = multi setMulti(phs) try multi(body) finally setMulti(saved) } - def atshow[T](phs: Seq[PhaseName])(body: => T): Unit = - atz[T](phs)(body) foreach { + def showAt[T](phs: Seq[PhaseName])(body: => T): Unit = + atMap[T](phs)(body) foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240)) } - def atz[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] = - phs zip ats(phs)(body) + def atMap[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] = + phs zip atMulti(phs)(body) object PhaseName { + implicit lazy val phaseNameOrdering: Ordering[PhaseName] = Ordering[Int] on (_.id) + lazy val all = List( Parser, Namer, Packageobjects, Typer, Superaccessors, Pickler, Refchecks, Selectiveanf, Liftcode, Selectivecps, Uncurry, Tailcalls, Specialize, diff --git a/src/compiler/scala/tools/nsc/interpreter/Power.scala b/src/compiler/scala/tools/nsc/interpreter/Power.scala index 0933365d9e..c2f72e9f37 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Power.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Power.scala @@ -6,20 +6,57 @@ package scala.tools.nsc package interpreter +import scala.reflect.NameTransformer import scala.collection.{ mutable, immutable } import scala.util.matching.Regex import scala.tools.nsc.util.{ BatchSourceFile } import session.{ History } +import scala.io.Codec +import java.net.{ URL, MalformedURLException } +import io.{ Path } + +trait SharesGlobal[G <: Global] { + val global: G + + // This business gets really old: + // + // found : power.intp.global.Symbol + // required: global.Symbol + // + // Have tried many ways to cast it aside, this is the current winner. + // Todo: figure out a way to abstract over all the type members. + type AnySymbol = Global#Symbol + type AnyType = Global#Type + type AnyName = Global#Name + type AnyTree = Global#Tree + + type Symbol = global.Symbol + type Type = global.Type + type Name = global.Name + type Tree = global.Tree + + implicit def upDependentSymbol(x: AnySymbol): Symbol = x.asInstanceOf[Symbol] + implicit def upDependentType(x: AnyType): Type = x.asInstanceOf[Type] + implicit def upDependentName(x: AnyName): Name = x.asInstanceOf[Name] + implicit def upDependentTree(x: AnyTree): Tree = x.asInstanceOf[Tree] +} + +object Power { + def apply[G <: Global](repl: ILoop, g: G) = + new { final val global: G = g } with Power[G](repl, repl.intp) + + def apply(intp: IMain) = + new { final val global = intp.global } with Power[Global](null, intp) +} /** A class for methods to be injected into the intp in power mode. */ -class Power(repl: ILoop, intp: IMain) { - def this(repl: ILoop) = this(repl, repl.intp) - def this(intp: IMain) = this(null, intp) - - val global: intp.global.type = intp.global - import global._ +abstract class Power[G <: Global]( + val repl: ILoop, + val intp: IMain +) extends SharesGlobal[G] { import intp.{ beQuietDuring, interpret, parse } + import global.{ opt, definitions, stringToTermName, NoSymbol, NoType, analyzer, CompilationUnit } abstract class SymSlurper { def isKeep(sym: Symbol): Boolean @@ -82,7 +119,10 @@ class Power(repl: ILoop, intp: IMain) { def slurp() = apply(modClass) } - def banner = """ + private def customBanner = replProps.powerBanner.option flatMap (f => io.File(f).safeSlurp()) + private def customInit = replProps.powerInitCode.option flatMap (f => io.File(f).safeSlurp()) + + def banner = customBanner getOrElse """ |** Power User mode enabled - BEEP BOOP WHIR ** |** scala.tools.nsc._ has been imported ** |** global._ and definitions._ also imported ** @@ -91,27 +131,28 @@ class Power(repl: ILoop, intp: IMain) { |** New defs! Type power.<tab> to reveal ** """.stripMargin.trim - def init = """ + def init = customInit getOrElse """ |import scala.tools.nsc._ - |val global: intp.global.type = intp.global + |import scala.collection.JavaConverters._ |import global._ - |import definitions._ - |import power.phased |import power.Implicits._ """.stripMargin /** Starts up power mode and runs whatever is in init. */ def unleash(): Unit = beQuietDuring { - if (repl != null) { - intp.bind[ILoop]("repl", repl) - intp.bind[History]("history", repl.in.history) - intp.bind("completion", repl.in.completion) - } + val r = new ReplVals(repl) + intp.bind[ILoop]("repl", repl) + intp.bind[ReplVals]("$r", r) + + intp.bind("intp", r.intp) + intp.bind("global", r.global) + intp.bind("power", r.power) + intp.bind("phased", r.phased) + intp.bind("isettings", r.isettings) + intp.bind("completion", r.completion) + intp.bind("history", r.history) - intp.bind[IMain]("intp", intp) - intp.bind[Power]("power", this) - intp.bind[ISettings]("isettings", intp.isettings) init split '\n' foreach interpret } @@ -122,9 +163,11 @@ class Power(repl: ILoop, intp: IMain) { private def getCompilerClass(name: String) = missingWrap(definitions.getClass(name)) private def getCompilerModule(name: String) = missingWrap(definitions.getModule(name)) - object InternalInfo { + trait LowPriorityInternalInfo { implicit def apply[T: Manifest] : InternalInfo[T] = new InternalInfo[T](None) } + object InternalInfo extends LowPriorityInternalInfo { } + /** Todos... * translate manifest type arguments into applied types * customizable symbol filter (had to hardcode no-spec to reduce noise) @@ -152,11 +195,13 @@ class Power(repl: ILoop, intp: IMain) { def allMembers = tpe.members def bts = info.baseTypeSeq.toList def btsmap = bts map (x => (x, x.decls.toList)) toMap - def pkgName = erasure.getPackage.getName - def pkg = getCompilerModule(pkgName) + def pkgName = Option(erasure.getPackage) map (_.getName) + def pkg = pkgName map getCompilerModule getOrElse NoSymbol def pkgmates = pkg.tpe.members - def pkgslurp = new PackageSlurper(pkgName) slurp() - + def pkgslurp = pkgName match { + case Some(name) => new PackageSlurper(name) slurp() + case _ => Set() + } def ? = this def whoHas(name: String) = bts filter (_.decls.toList exists (_.name.toString == name)) @@ -171,8 +216,24 @@ class Power(repl: ILoop, intp: IMain) { } } - trait PCFormatter extends (Any => List[String]) { - def apply(x: Any): List[String] + trait LowPriorityPrettifier { + implicit object AnyPrettifier extends Prettifier[Any] { + def prettify(x: Any): List[String] = x match { + case x: Name => List(x.decode) + case Tuple2(k, v) => List(prettify(k) ++ Seq("->") ++ prettify(v) mkString " ") + case xs: TraversableOnce[_] => (xs.toList flatMap prettify).sorted + case x => List(rutil.stringOf(x)) + } + } + } + object Prettifier extends LowPriorityPrettifier { + def prettify[T](value: T): List[String] = default[T] prettify value + def default[T] = new Prettifier[T] { + def prettify(x: T): List[String] = AnyPrettifier prettify x + } + } + trait Prettifier[T] { + def prettify(x: T): List[String] private var indentLevel = 0 private def spaces = " " * indentLevel @@ -182,12 +243,13 @@ class Power(repl: ILoop, intp: IMain) { finally indentLevel -= 1 } - def show(x: Any): Unit = grep(x, _ => true) - def grep(x: Any, p: String => Boolean): Unit = - apply(x) filter p foreach (x => println(spaces + x)) + def show(x: T): Unit = grep(x, _ => true) + def grep(x: T, p: String => Boolean): Unit = + prettify(x) filter p foreach (x => println(spaces + x)) } - class MultiPrintingConvenience[T](coll: Traversable[T])(implicit fmt: PCFormatter) { - import fmt._ + class MultiPrintingConvenience[T: Prettifier](coll: TraversableOnce[T]) { + val pretty = implicitly[Prettifier[T]] + import pretty._ def freqBy[U](p: T => U) = { val map = coll.toList groupBy p @@ -197,8 +259,8 @@ class Power(repl: ILoop, intp: IMain) { val buf = new mutable.ListBuffer[String] freqBy(p) foreach { case (k, vs) => - buf += "%d: %s".format(vs.size, k) - vs flatMap fmt foreach (buf += " " + _) + buf += "%d: %s".format(vs.size, Prettifier.prettify(k)) + vs flatMap prettify foreach (buf += " " + _) } buf.toList } @@ -215,45 +277,85 @@ class Power(repl: ILoop, intp: IMain) { def #?[U](p: T => U) = this freqByFormatted p } - class PrintingConvenience[T](value: T)(implicit fmt: PCFormatter) { - def > : Unit = >(_ => true) + class PrintingConvenience[T: Prettifier](value: T) { + val pretty = implicitly[Prettifier[T]] + + def > { >(_ => true) } def >(s: String): Unit = >(_ contains s) def >(r: Regex): Unit = >(_ matches r.pattern.toString) - def >(p: String => Boolean): Unit = fmt.grep(value, p) + def >(p: String => Boolean): Unit = pretty.grep(value, p) } + class RichInputStream(in: InputStream)(implicit codec: Codec) { + def bytes(): Array[Byte] = io.Streamable.bytes(in) + def slurp(): String = io.Streamable.slurp(in) + } + protected trait Implicits1 { - implicit def replPrinting[T](x: T)(implicit fmt: PCFormatter) = new PrintingConvenience[T](x) + // fallback + implicit def replPrinting[T](x: T)(implicit pretty: Prettifier[T] = Prettifier.default[T]) = new PrintingConvenience[T](x) } - object Implicits extends Implicits1 { - implicit lazy val powerNameOrdering: Ordering[Name] = Ordering[String] on (_.toString) - implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name) - implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol) + trait Implicits2 extends Implicits1 with SharesGlobal[G] { + import global._ + class RichSymbol(sym: Symbol) { + // convenient type application + def apply(targs: Type*): Type = typeRef(NoPrefix, sym, targs.toList) + } object symbolSubtypeOrdering extends Ordering[Symbol] { def compare(s1: Symbol, s2: Symbol) = if (s1 eq s2) 0 else if (s1 isLess s2) -1 else 1 } - implicit def replCollPrinting[T](xs: Traversable[T])(implicit fmt: PCFormatter) = new MultiPrintingConvenience[T](xs) + implicit lazy val powerNameOrdering: Ordering[Name] = Ordering[String] on (_.toString) + implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name) + implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol) + + implicit def replCollPrinting[T: Prettifier](xs: TraversableOnce[T]): MultiPrintingConvenience[T] = new MultiPrintingConvenience[T](xs) implicit def replInternalInfo[T: Manifest](x: T): InternalInfo[T] = new InternalInfo[T](Some(x)) - implicit object ReplDefaultFormatter extends PCFormatter { - def apply(x: Any): List[String] = x match { - case Tuple2(k, v) => List(apply(k) ++ Seq("->") ++ apply(v) mkString " ") - case xs: Traversable[_] => (xs.toList flatMap apply).sorted.distinct - case x => List("" + x) + implicit def replPrettifier[T] : Prettifier[T] = Prettifier.default[T] + implicit def replTypeApplication(sym: Symbol): RichSymbol = new RichSymbol(sym) + implicit def replInputStream(in: InputStream)(implicit codec: Codec): RichInputStream = new RichInputStream(in) + implicit def replInputStreamURL(url: URL)(implicit codec: Codec) = replInputStream(url.openStream()) + } + object Implicits extends Implicits2 { + val global: G = Power.this.global + } + + trait ReplUtilities { + def ?[T: Manifest] = InternalInfo[T] + def url(s: String) = { + try new URL(s) + catch { case _: MalformedURLException => + if (Path(s).exists) Path(s).toURL + else new URL("http://" + s) + } + } + def sanitize(s: String): String = sanitize(s.getBytes()) + def sanitize(s: Array[Byte]): String = (s map { + case x if x.toChar.isControl => '?' + case x => x.toChar + }).mkString + + def strings(s: Seq[Byte]): List[String] = { + if (s.length == 0) Nil + else s dropWhile (_.toChar.isControl) span (x => !x.toChar.isControl) match { + case (next, rest) => next.map(_.toChar).mkString :: strings(rest) } } + def stringOf(x: Any): String = scala.runtime.ScalaRunTime.stringOf(x) } - object phased extends Phased { - val global: Power.this.global.type = Power.this.global + lazy val rutil: ReplUtilities = new ReplUtilities { } + lazy val phased: Phased = new Phased with SharesGlobal[G] { + val global: G = Power.this.global } - def context(code: String) = analyzer.rootContext(unit(code)) - def source(code: String) = new BatchSourceFile("<console>", code) - def unit(code: String) = new CompilationUnit(source(code)) - def trees(code: String): List[Tree] = parse(code) getOrElse Nil - def typeOf(id: String): Type = intp.typeOfExpression(id) getOrElse NoType + + def context(code: String) = analyzer.rootContext(unit(code)) + def source(code: String) = new BatchSourceFile("<console>", code) + def unit(code: String) = new CompilationUnit(source(code)) + def trees(code: String) = parse(code) getOrElse Nil + def typeOf(id: String): Type = intp.typeOfExpression(id) getOrElse NoType override def toString = """ |** Power mode status ** diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala new file mode 100644 index 0000000000..a8287e3a9a --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala @@ -0,0 +1,42 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import sys.{ Prop, BooleanProp } + +trait ReplConfig { + + class ReplProps { + private def bool(name: String) = BooleanProp.keyExists(name) + + val jlineDebug = bool("scala.tools.jline.internal.Log.debug") + val jlineTrace = bool("scala.tools.jline.internal.Log.trace") + + val debug = bool("scala.repl.debug") + val trace = bool("scala.repl.trace") + val power = bool("scala.repl.power") + + val replInitCode = Prop[JFile]("scala.repl.initcode") + val powerInitCode = Prop[JFile]("scala.repl.power.initcode") + val powerBanner = Prop[JFile]("scala.repl.power.banner") + } + lazy val replProps = new ReplProps + + /** Debug output */ + private[nsc] def repldbg(msg: String) = if (isReplDebug) Console println msg + + /** Tracing */ + private[nsc] def tracing[T](msg: String)(x: T): T = { + if (isReplDebug) + println("(" + msg + ") " + x) + + x + } + + def isReplDebug: Boolean = replProps.debug + def isReplPower: Boolean = replProps.power +} diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala new file mode 100644 index 0000000000..cef46c963a --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala @@ -0,0 +1,45 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import scala.collection.{ mutable, immutable } +import scala.PartialFunction.cond +import scala.reflect.NameTransformer +import util.Chars + +trait ReplStrings { + // Longest common prefix + def longestCommonPrefix(xs: List[String]): String = { + if (xs.isEmpty || xs.contains("")) "" + else xs.head.head match { + case ch => + if (xs.tail forall (_.head == ch)) "" + ch + longestCommonPrefix(xs map (_.tail)) + else "" + } + } + /** Convert a string into code that can recreate the string. + * This requires replacing all special characters by escape + * codes. It does not add the surrounding " marks. */ + def string2code(str: String): String = { + val res = new StringBuilder + for (c <- str) c match { + case '"' | '\'' | '\\' => res += '\\' ; res += c + case _ if c.isControl => res ++= Chars.char2uescape(c) + case _ => res += c + } + res.toString + } + + def string2codeQuoted(str: String) = + "\"" + string2code(str) + "\"" + + def any2stringOf(x: Any, maxlen: Int) = + "scala.runtime.ScalaRunTime.replStringOf(%s, %s)".format(x, maxlen) + + def words(s: String) = s.trim split "\\s+" filterNot (_ == "") toList + def isQuoted(s: String) = (s.length >= 2) && (s.head == s.last) && ("\"'" contains s.head) +} diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala new file mode 100644 index 0000000000..2c5f5474af --- /dev/null +++ b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala @@ -0,0 +1,20 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package interpreter + +import java.lang.reflect.{ Method => JMethod } + +class ReplVals(final val r: ILoop) { + final val intp = r.intp + final val global = r.power.global + final val power = r.power + final val phased = r.power.phased + final val isettings = r.intp.isettings + final val completion = r.in.completion + final val history = r.in.history + final val rutil = r.power.rutil +} diff --git a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala index e377a140af..fc286b4868 100644 --- a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala +++ b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala @@ -63,7 +63,7 @@ trait TypeStrings { private def tvarString(tvar: TypeVariable[_]): String = tvarString(tvar.getBounds.toList) private def tvarString(bounds: List[AnyRef]): String = { - val xs = bounds filterNot (_ == ObjectClass) collect { case x: Class[_] => x } + val xs = bounds filterNot (_ == ObjectClass) collect { case x: JClass => x } if (xs.isEmpty) "_" else scalaName(xs.head) } diff --git a/src/compiler/scala/tools/nsc/interpreter/package.scala b/src/compiler/scala/tools/nsc/interpreter/package.scala index 13fb860128..1865e90e92 100644 --- a/src/compiler/scala/tools/nsc/interpreter/package.scala +++ b/src/compiler/scala/tools/nsc/interpreter/package.scala @@ -22,50 +22,17 @@ package scala.tools.nsc * InteractiveReader contains { history: History, completion: Completion } * IMain contains { global: Global } */ -package object interpreter { +package object interpreter extends ReplConfig with ReplStrings { + type JFile = java.io.File type JClass = java.lang.Class[_] type JList[T] = java.util.List[T] type JCollection[T] = java.util.Collection[T] - - private[nsc] val DebugProperty = "scala.repl.debug" - private[nsc] val TraceProperty = "scala.repl.trace" - private[nsc] val PowerProperty = "scala.repl.power" - private[nsc] var isReplDebug = sys.props contains DebugProperty // Also set by -Yrepl-debug - private[nsc] var isReplPower = sys.props contains PowerProperty + type InputStream = java.io.InputStream + type OutputStream = java.io.OutputStream private[nsc] implicit def enrichClass[T](clazz: Class[T]) = new RichClass[T](clazz) private[interpreter] implicit def javaCharSeqCollectionToScala(xs: JCollection[_ <: CharSequence]): List[String] = { import collection.JavaConverters._ xs.asScala.toList map ("" + _) } - - /** Debug output */ - private[nsc] def repldbg(msg: String) = if (isReplDebug) Console println msg - - /** Tracing */ - private[nsc] def tracing[T](msg: String)(x: T): T = { - if (isReplDebug) - println("(" + msg + ") " + x) - - x - } - - // Longest common prefix - def longestCommonPrefix(xs: List[String]): String = { - if (xs.isEmpty || xs.contains("")) "" - else xs.head.head match { - case ch => - if (xs.tail forall (_.head == ch)) "" + ch + longestCommonPrefix(xs map (_.tail)) - else "" - } - } - - private[nsc] def words(s: String) = s.trim split "\\s+" toList - private[nsc] def isQuoted(s: String) = - (s.length >= 2) && (s.head == s.last) && ("\"'" contains s.head) - - /** Class objects */ - private[nsc] def classForName(name: String): Option[JClass] = - try Some(Class forName name) - catch { case _: ClassNotFoundException | _: SecurityException => None } } diff --git a/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala b/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala new file mode 100644 index 0000000000..88efe1e0b5 --- /dev/null +++ b/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala @@ -0,0 +1,39 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.nsc +package io + +import java.net.URL +import collection.JavaConverters._ + +/** A convenience class for finding the jar with the bytecode for + * a given Class object and similar common tasks. + */ +class ClassAndJarInfo[T: ClassManifest] { + val man = classManifest[T] + def clazz = man.erasure + + def baseOfPath(path: String) = path indexOf '!' match { + case -1 => path stripSuffix internalClassName + case idx => path take idx + } + + def classUrl = clazz getResource simpleClassName + ".class" + def codeSource = protectionDomain.getCodeSource() + def internalClassName = internalName + ".class" + def internalName = clazz.getName.replace('.', '/') + def jarManifest = new JManifest(jarManifestUrl.openStream()) + def jarManifestMainAttrs = jarManifest.getMainAttributes().asScala + def jarManifestUrl = new URL(baseOfPath("" + classUrl) + "!/META-INF/MANIFEST.MF") + def locationFile = File(locationUrl.toURI.getPath()) + def locationUrl = if (codeSource == null) new URL("file:///") else codeSource.getLocation() + def protectionDomain = clazz.getProtectionDomain() + def rootClasspath = rootPossibles find (_.exists) + def rootFromLocation = Path(locationUrl.toURI.getPath()) + def rootFromResource = Path(baseOfPath(classUrl.getPath) stripPrefix "file:") + def rootPossibles = Iterator(rootFromResource, rootFromLocation) + def simpleClassName = clazz.getName split """[$.]""" last +} diff --git a/src/compiler/scala/tools/nsc/io/File.scala b/src/compiler/scala/tools/nsc/io/File.scala index 60d9a0f169..b11151ab7e 100644 --- a/src/compiler/scala/tools/nsc/io/File.scala +++ b/src/compiler/scala/tools/nsc/io/File.scala @@ -137,6 +137,10 @@ class File(jfile: JFile)(implicit constructorCodec: Codec) extends Path(jfile) w finally out close } + def safeSlurp(): Option[String] = + try Some(slurp()) + catch { case _: IOException => None } + def copyTo(destPath: Path, preserveFileDate: Boolean = false): Boolean = { val CHUNK = 1024 * 1024 * 16 // 16 MB val dest = destPath.toFile diff --git a/src/compiler/scala/tools/nsc/io/Jar.scala b/src/compiler/scala/tools/nsc/io/Jar.scala index a9f0acaa00..bd7dbde5ec 100644 --- a/src/compiler/scala/tools/nsc/io/Jar.scala +++ b/src/compiler/scala/tools/nsc/io/Jar.scala @@ -1,3 +1,8 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + package scala.tools.nsc package io @@ -5,6 +10,27 @@ import java.io.{ InputStream, OutputStream, IOException, FileNotFoundException, import java.util.jar._ import collection.JavaConverters._ import Attributes.Name +import util.ClassPath + +// Attributes.Name instances: +// +// static Attributes.Name CLASS_PATH +// static Attributes.Name CONTENT_TYPE +// static Attributes.Name EXTENSION_INSTALLATION +// static Attributes.Name EXTENSION_LIST +// static Attributes.Name EXTENSION_NAME +// static Attributes.Name IMPLEMENTATION_TITLE +// static Attributes.Name IMPLEMENTATION_URL +// static Attributes.Name IMPLEMENTATION_VENDOR +// static Attributes.Name IMPLEMENTATION_VENDOR_ID +// static Attributes.Name IMPLEMENTATION_VERSION +// static Attributes.Name MAIN_CLASS +// static Attributes.Name MANIFEST_VERSION +// static Attributes.Name SEALED +// static Attributes.Name SIGNATURE_VERSION +// static Attributes.Name SPECIFICATION_TITLE +// static Attributes.Name SPECIFICATION_VENDOR +// static Attributes.Name SPECIFICATION_VERSION class Jar(file: File) extends Iterable[JarEntry] { def this(path: String) = this(File(path)) @@ -74,21 +100,6 @@ object Jar { def isJarOrZip(f: Path, examineFile: Boolean): Boolean = f.hasExtension("zip", "jar") || (examineFile && magicNumberIsZip(f)) - def locateByClass(clazz: Class[_]): Option[File] = { - try Some(File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath())) - catch { case _: Exception => None } - } - /** Walks upward from wherever the scala library jar is searching for - * the given jar name. This approach finds the scala library jar in the - * release layout and in trunk builds going up from pack. - */ - def locateByName(name: String): Option[File] = { - def toSrc(d: Directory) = d.dirs.toList map (_ / name) - def walk(d: Directory) = d.parents flatMap toSrc find (_.isFile) map (_.toFile) - - locateByClass(classOf[ScalaObject]) flatMap (x => walk(x.parent)) - } - def create(file: File, sourceDir: Directory, mainClass: String): File = { val writer = new Jar(file).jarWriter() writer.manifest(Name.MANIFEST_VERSION) = "1.0" diff --git a/src/compiler/scala/tools/nsc/io/Sources.scala b/src/compiler/scala/tools/nsc/io/Sources.scala index c763b04511..35c7a504a5 100644 --- a/src/compiler/scala/tools/nsc/io/Sources.scala +++ b/src/compiler/scala/tools/nsc/io/Sources.scala @@ -4,7 +4,6 @@ package io import util.ClassPath import java.util.concurrent.{ Future, ConcurrentHashMap, ExecutionException } import java.util.zip.ZipException -import Jar.{ isJarOrZip, locateByClass } import collection.JavaConverters._ import Properties.{ envOrElse, propOrElse } @@ -20,7 +19,7 @@ class Sources(val path: String) { private val partitioned = ClassPath toPaths expandedPath partition (_.isDirectory) val dirs = partitioned._1 map (_.toDirectory) - val jars = partitioned._2 filter isJarOrZip map (_.toFile) + val jars = partitioned._2 filter Jar.isJarOrZip map (_.toFile) val (isDone, force) = { val f1 = spawn(calculateDirs()) val f2 = spawn(calculateJars()) @@ -63,25 +62,12 @@ trait LowPrioritySourcesImplicits { } object Sources extends LowPrioritySourcesImplicits { - // Examples of what libraryJar might be, each of which we'd like to find - // the source files automatically: - // - // /scala/trunk/build/pack/lib/scala-library.jar - // /scala/trunk/build/quick/classes/library - // /scala/inst/scala-2.9.0.r24213-b20110206233447/lib/scala-library.jar - private def libraryJar = locateByClass(classOf[ScalaObject]) map (_.toAbsolute.path) - private def autoSourcePaths: List[String] = libraryJar.toList flatMap { lib => - val markers = List("build/pack/lib", "build/quick/classes", "scala-library.jar") - markers filter (lib contains _) flatMap { m => - val dir = Path(lib take lib.indexOf(m)) / "src" - - if (dir.exists) ClassPath.expandDir(dir.path) - else Nil - } - } + private def libraryInits = ClassPath.scalaLibrary.toList flatMap (_.toAbsolute.parents) + private def librarySourceDir = libraryInits map (_ / "src") find (_.isDirectory) + private def expandedSourceDir = librarySourceDir.toList flatMap (ClassPath expandDir _.path) - val sourcePathEnv = envOrElse("SOURCEPATH", "") - val defaultSources = apply(autoSourcePaths :+ sourcePathEnv: _*) + val sourcePathProp = sys.props.traceSourcePath.value + val defaultSources = apply(expandedSourceDir :+ sourcePathProp: _*) def apply(paths: String*): Sources = new Sources(ClassPath.join(paths: _*)) } diff --git a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala index 3de17d6b56..c600f6364b 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala @@ -305,14 +305,14 @@ trait JavaScanners extends ast.parser.ScannersCommon { */ private def fetchToken() { if (token == EOF) return - lastPos = in.cpos - 1 // Position.encode(in.cline, in.ccol) + lastPos = in.cpos - 1 //var index = bp while (true) { in.ch match { case ' ' | '\t' | CR | LF | FF => in.next case _ => - pos = in.cpos // Position.encode(in.cline, in.ccol) + pos = in.cpos (in.ch: @switch) match { case 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | diff --git a/src/compiler/scala/tools/nsc/plugins/Plugins.scala b/src/compiler/scala/tools/nsc/plugins/Plugins.scala index 6205633a7c..64e38fee9a 100644 --- a/src/compiler/scala/tools/nsc/plugins/Plugins.scala +++ b/src/compiler/scala/tools/nsc/plugins/Plugins.scala @@ -115,6 +115,6 @@ trait Plugins { /** Summary of the options for all loaded plugins */ def pluginOptionsHelp: String = (for (plug <- roughPluginsList ; help <- plug.optionsHelp) yield { - "Options for plugin %s:\n%s\n".format(plug.name, help) + "\nOptions for plugin '%s':\n%s\n".format(plug.name, help) }) mkString } diff --git a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala index 6f130b9e74..be2f8a370a 100644 --- a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala @@ -9,17 +9,19 @@ package settings trait AbsScalaSettings { self: AbsSettings => - type BooleanSetting <: AbsSetting { type T = Boolean } - type ChoiceSetting <: AbsSetting { type T = String } - type IntSetting <: AbsSetting { type T = Int } - type MultiStringSetting <: AbsSetting { type T = List[String] } - type PathSetting <: AbsSetting { type T = String } - type PhasesSetting <: AbsSetting { type T = List[String] } - type StringSetting <: AbsSetting { type T = String } - type PrefixSetting <: AbsSetting { type T = List[String] } + type Setting <: AbsSetting + + type BooleanSetting <: Setting { type T = Boolean } + type ChoiceSetting <: Setting { type T = String } + type IntSetting <: Setting { type T = Int } + type MultiStringSetting <: Setting { type T = List[String] } + type PathSetting <: Setting { type T = String } + type PhasesSetting <: Setting { type T = List[String] } + type StringSetting <: Setting { type T = String } + type PrefixSetting <: Setting { type T = List[String] } type OutputDirs - type OutputSetting <: AbsSetting + type OutputSetting <: Setting def BooleanSetting(name: String, descr: String): BooleanSetting def ChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String], default: String): ChoiceSetting diff --git a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala index f70e6dc7d3..82e311028b 100644 --- a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala @@ -75,8 +75,10 @@ trait AbsSettings { */ def withAbbreviation(name: String): this.type def withHelpSyntax(help: String): this.type + def withDeprecationMessage(msg: String): this.type def helpSyntax: String = name + def deprecationMessage: Option[String] = None def abbreviations: List[String] = Nil def dependencies: List[(Setting, String)] = Nil def respondsTo(label: String) = (name == label) || (abbreviations contains label) @@ -122,10 +124,11 @@ trait AbsSettings { /** These categorizations are so the help output shows -X and -P among * the standard options and -Y among the advanced options. */ - def isAdvanced = name match { case "-Y" => true ; case "-X" => false ; case _ => name startsWith "-X" } - def isPrivate = name match { case "-Y" => false ; case _ => name startsWith "-Y" } - def isStandard = !isAdvanced && !isPrivate - def isForDebug = isPrivate && (name contains ("-debug")) // by convention, i.e. -Ytyper-debug + def isAdvanced = name match { case "-Y" => true ; case "-X" => false ; case _ => name startsWith "-X" } + def isPrivate = name match { case "-Y" => false ; case _ => name startsWith "-Y" } + def isStandard = !isAdvanced && !isPrivate + def isForDebug = name endsWith "-debug" // by convention, i.e. -Ytyper-debug + def isDeprecated = deprecationMessage.isDefined def compare(that: Setting): Int = name compare that.name diff --git a/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala b/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala index d7bec764b3..0908ea60b6 100644 --- a/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala @@ -25,7 +25,7 @@ trait AestheticSettings { def fatalWarnings = settings.Xwarnfatal.value def logClasspath = settings.Ylogcp.value def printStats = settings.Ystatistics.value - def richExes = settings.YrichExes.value + def richExes = settings.YrichExes.value || sys.props.traceSourcePath.isSet def target = settings.target.value def unchecked = settings.unchecked.value def verbose = settings.verbose.value diff --git a/src/compiler/scala/tools/nsc/settings/FscSettings.scala b/src/compiler/scala/tools/nsc/settings/FscSettings.scala index a219148b16..bb62750026 100644 --- a/src/compiler/scala/tools/nsc/settings/FscSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/FscSettings.scala @@ -8,28 +8,45 @@ package nsc package settings import util.ClassPath +import io.{ Directory, Path, AbstractFile } class FscSettings(error: String => Unit) extends Settings(error) { outer => - def this() = this(Console.println) + locally { + disable(prompt) + disable(resident) + } + val currentDir = StringSetting ("-current-dir", "path", "Base directory for resolving relative paths", "").internalOnly() val reset = BooleanSetting("-reset", "Reset compile server caches") val shutdown = BooleanSetting("-shutdown", "Shutdown compile server") val server = StringSetting ("-server", "hostname:portnumber", "Specify compile server socket", "") - val preferIPv4 = BooleanSetting("-ipv4", "Use IPv4 rather than IPv6 for the server socket") - val absClasspath = BooleanSetting("-absolute-cp", "Make classpath elements absolute paths before sending to server") . - withPostSetHook (_ => absolutizeClasspath()) + val preferIPv4 = BooleanSetting("-ipv4", "Use IPv4 rather than IPv6 for the server socket") val idleMins = IntSetting ("-max-idle", "Set idle timeout in minutes for fsc (use 0 for no timeout)", 30, Some(0, Int.MaxValue), (_: String) => None) - disable(prompt) - disable(resident) + // For improved help output, separating fsc options from the others. + def fscSpecific = Set[Settings#Setting]( + currentDir, reset, shutdown, server, preferIPv4, idleMins + ) + val isFscSpecific: String => Boolean = fscSpecific map (_.name) + + /** If a setting (other than a PathSetting) represents a path or paths. + * For use in absolutization. + */ + private def holdsPath = Set[Settings#Setting]( + d, dependencyfile, pluginsDir, Ygenjavap + ) - // Make the classpath absolute: for going from client to server. - private def absolutizeClasspath() { - userSetSettings collect { - case x: PathSetting => x.value = ClassPath.makeAbsolute(x.value) + /** All user set settings rewritten with absolute paths. */ + def absolutize(root: Path) { + def rewrite(p: String) = (root resolve Path(p)).normalize.path + userSetSettings foreach { + case p: OutputSetting => p.outputDirs setSingleOutput AbstractFile.getDirectory(rewrite(p.value)) + case p: PathSetting => p.value = ClassPath.map(p.value, rewrite) + case p: StringSetting => if (holdsPath(p)) p.value = rewrite(p.value) + case _ => () } } } diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala index b485d4725a..477c2a528e 100644 --- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala @@ -345,6 +345,10 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal private var dependency: Option[(Setting, String)] = None override def dependencies = dependency.toList def dependsOn(s: Setting, value: String): this.type = { dependency = Some((s, value)); this } + + private var _deprecationMessage: Option[String] = None + override def deprecationMessage = _deprecationMessage + def withDeprecationMessage(msg: String): this.type = { _deprecationMessage = Some(msg) ; this } } /** A setting represented by an integer */ @@ -479,13 +483,14 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal /** Set the output directory. */ class OutputSetting private[nsc]( - outputDirs: OutputDirs, + private[nsc] val outputDirs: OutputDirs, default: String) extends StringSetting("-d", "directory", "Specify where to place generated class files", default) { value = default override def value_=(str: String) { super.value_=(str) - outputDirs.setSingleOutput(str) + try outputDirs.setSingleOutput(str) + catch { case FatalError(msg) => errorFn(msg) } } } @@ -559,7 +564,7 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal protected var v: List[String] = Nil override def value = if (v contains "all") List("all") else super.value private lazy val (numericValues, stringValues) = - value partition (_ forall (ch => ch.isDigit || ch == '-')) + value filterNot (_ == "" ) partition (_ forall (ch => ch.isDigit || ch == '-')) /** A little ad-hoc parsing. If a string is not the name of a phase, it can also be: * a phase id: 5 diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index 7405ca0b3d..a92b5d7034 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -79,7 +79,6 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val sourceReader = StringSetting ("-Xsource-reader", "classname", "Specify a custom method for reading source files.", "") val Xwarnfatal = BooleanSetting ("-Xfatal-warnings", "Fail the compilation if there are any warnings.") - val Xwarninit = BooleanSetting ("-Xwarninit", "Warn about possible changes in initialization semantics.") val Xchecknull = BooleanSetting ("-Xcheck-null", "Emit warning on selection of nullable reference.") // Experimental Extensions @@ -129,21 +128,25 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val Ynosqueeze = BooleanSetting ("-Yno-squeeze", "Disable creation of compact code in matching.") val Ystatistics = BooleanSetting ("-Ystatistics", "Print compiler statistics.") . withPostSetHook(set => util.Statistics.enabled = set.value) - val stop = PhasesSetting ("-Ystop", "Stop after phase") + val stopAfter = PhasesSetting ("-Ystop-after", "Stop after given phase") withAbbreviation ("-stop") // backward compat + val stopBefore = PhasesSetting ("-Ystop-before", "Stop before given phase") val refinementMethodDispatch = ChoiceSetting ("-Ystruct-dispatch", "policy", "structural method dispatch policy", List("no-cache", "mono-cache", "poly-cache", "invoke-dynamic"), "poly-cache") val Yrangepos = BooleanSetting ("-Yrangepos", "Use range positions for syntax trees.") - val YrichExes = BooleanSetting ("-Yrich-exceptions", "More revealing exceptions. Set SOURCEPATH to java/scala source jars.") + val YrichExes = BooleanSetting ("-Yrich-exceptions", + "Fancier exceptions. Set source search path with -D" + + sys.SystemProperties.traceSourcePath.key) val Yidedebug = BooleanSetting ("-Yide-debug", "Generate, validate and output trees using the interactive compiler.") val Ybuilderdebug = ChoiceSetting ("-Ybuilder-debug", "manager", "Compile using the specified build manager.", List("none", "refined", "simple"), "none") val Ybuildmanagerdebug = BooleanSetting ("-Ybuild-manager-debug", "Generate debug information for the Refined Build Manager compiler.") - val Ytyperdebug = BooleanSetting ("-Ytyper-debug", "Trace all type assignements.") + val Ytyperdebug = BooleanSetting ("-Ytyper-debug", "Trace all type assignments.") val Ypmatdebug = BooleanSetting ("-Ypmat-debug", "Trace all pattern matcher activity.") val Yrepldebug = BooleanSetting ("-Yrepl-debug", "Trace all repl activity.") . - withPostSetHook(set => interpreter.isReplDebug = true) + withPostSetHook(_ => interpreter.replProps.debug setValue true) val Ycompletion = BooleanSetting ("-Ycompletion-debug", "Trace all tab completion activity.") + val Ydocdebug = BooleanSetting ("-Ydoc-debug", "Trace all scaladoc activity.") val Ypmatnaive = BooleanSetting ("-Ypmat-naive", "Desugar matches as naively as possible.") val Ynotnull = BooleanSetting ("-Ynotnull", "Enable (experimental and incomplete) scala.NotNull.") val YdepMethTpes = BooleanSetting ("-Ydependent-method-types", "Allow dependent method types.") @@ -153,6 +156,8 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val exposeEmptyPackage = BooleanSetting("-Yexpose-empty-package", "Internal only: expose the empty package.").internalOnly() + def stop = stopAfter + /** * Warnings */ diff --git a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala index 3975ae4998..cc960e55dd 100644 --- a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala @@ -35,6 +35,7 @@ trait StandardScalaSettings { val g = ChoiceSetting ("-g", "level", "Set level of generated debugging info.", List("none", "source", "line", "vars", "notailcalls"), "vars") val help = BooleanSetting ("-help", "Print a synopsis of standard options") val make = ChoiceSetting ("-make", "policy", "Recompilation detection policy", List("all", "changed", "immediate", "transitive", "transitivenocp"), "all") + . withDeprecationMessage ("this option is unmaintained. Use sbt or an IDE for selective recompilation.") val nowarn = BooleanSetting ("-nowarn", "Generate no warnings") val optimise: BooleanSetting // depends on post hook which mutates other settings val print = BooleanSetting ("-print", "Print program with Scala-specific features removed.") diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 118d650586..1134f0e15f 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -539,10 +539,10 @@ trait Definitions extends reflect.generic.StandardDefinitions { var Object_synchronized: Symbol = _ lazy val Object_isInstanceOf = newPolyMethod( ObjectClass, "$isInstanceOf", - tparam => MethodType(List(), booltype)) setFlag FINAL + tparam => MethodType(List(), booltype)) setFlag (FINAL | SYNTHETIC) lazy val Object_asInstanceOf = newPolyMethod( ObjectClass, "$asInstanceOf", - tparam => MethodType(List(), tparam.typeConstructor)) setFlag FINAL + tparam => MethodType(List(), tparam.typeConstructor)) setFlag (FINAL | SYNTHETIC) def Object_getClass = getMember(ObjectClass, nme.getClass_) def Object_clone = getMember(ObjectClass, nme.clone_) @@ -614,6 +614,10 @@ trait Definitions extends reflect.generic.StandardDefinitions { case result => result } } + def packageExists(packageName: String): Boolean = { + try getModuleOrClass(newTermName(packageName)).isPackage + catch { case _: MissingRequirementError => false } + } /** If you're looking for a class, pass a type name. * If a module, a term name. @@ -741,7 +745,8 @@ trait Definitions extends reflect.generic.StandardDefinitions { case _ => tp } def flatNameString(sym: Symbol, separator: Char): String = - if (sym.owner.isPackageClass) sym.fullName('.') + (if (sym.isModuleClass) "$" else "") + if (sym == NoSymbol) "" // be more resistant to error conditions, e.g. neg/t3222.scala + else if (sym.owner.isPackageClass) sym.fullName('.') + (if (sym.isModuleClass) "$" else "") else flatNameString(sym.owner, separator) + "$" + sym.simpleName; def signature1(etp: Type): String = { if (etp.typeSymbol == ArrayClass) "[" + signature1(erasure(etp.normalize.typeArgs.head)) diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index d7f9063ec6..d17077b129 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -59,6 +59,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => // annotations private var rawannots: List[AnnotationInfoBase] = Nil + def rawAnnotations = rawannots /* Used in namer to check whether annotations were already assigned or not */ def hasAssignedAnnotations = rawannots.nonEmpty @@ -1400,8 +1401,17 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => final def overridingSymbol(ofclazz: Symbol): Symbol = if (isClassConstructor) NoSymbol else matchingSymbol(ofclazz, ofclazz.thisType) + /** Returns all symbols overriden by this symbol + */ final def allOverriddenSymbols: List[Symbol] = if (!owner.isClass) Nil + else owner.ancestors map overriddenSymbol filter (_ != NoSymbol) + + /** Returns all symbols overridden by this symbol, plus all matching symbols + * defined in parents of the selftype + */ + final def extendedOverriddenSymbols: List[Symbol] = + if (!owner.isClass) Nil else owner.thisSym.ancestors map overriddenSymbol filter (_ != NoSymbol) /** The symbol accessed by a super in the definition of this symbol when diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 4eca9f140e..96ff17e897 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -933,7 +933,7 @@ abstract class ClassfileParser { throw new RuntimeException("Scala class file does not contain Scala annotation") } if (settings.debug.value) - log("" + sym + "; annotations = " + sym.annotations) + log("" + sym + "; annotations = " + sym.rawAnnotations) } else in.skip(attrLen) diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala index b57f89c020..0940598bd2 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala @@ -582,12 +582,12 @@ abstract class Pickler extends SubComponent { case ClassInfoType(parents, decls, clazz) => writeRef(clazz); writeRefs(parents); CLASSINFOtpe case mt @ MethodType(formals, restpe) => - writeRef(restpe); writeRefs(formals) - if (mt.isImplicit) IMPLICITMETHODtpe - else METHODtpe - case mt @ NullaryMethodType(restpe) => // reuse POLYtpe since those can never have an empty list of tparams -- TODO: is there any way this can come back and bite us in the bottom? - // ugliness and thrift aside, this should make this somewhat more backward compatible - // (I'm not sure how old scalac's would deal with nested PolyTypes, as these used to be folded into one) + writeRef(restpe); writeRefs(formals) ; METHODtpe + case mt @ NullaryMethodType(restpe) => + // reuse POLYtpe since those can never have an empty list of tparams. + // TODO: is there any way this can come back and bite us in the bottom? + // ugliness and thrift aside, this should make this somewhat more backward compatible + // (I'm not sure how old scalac's would deal with nested PolyTypes, as these used to be folded into one) writeRef(restpe); writeRefs(Nil); POLYtpe case PolyType(tparams, restpe) => // invar: tparams nonEmpty writeRef(restpe); writeRefs(tparams); POLYtpe @@ -1037,8 +1037,7 @@ abstract class Pickler extends SubComponent { case ClassInfoType(parents, decls, clazz) => print("CLASSINFOtpe "); printRef(clazz); printRefs(parents); case mt @ MethodType(formals, restpe) => - print(if (mt.isImplicit) "IMPLICITMETHODtpe " else "METHODtpe "); - printRef(restpe); printRefs(formals) + print("METHODtpe"); printRef(restpe); printRefs(formals) case PolyType(tparams, restpe) => print("POLYtpe "); printRef(restpe); printRefs(tparams); case ExistentialType(tparams, restpe) => diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala index 8d0ecd247b..9980db6ff5 100644 --- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala +++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala @@ -512,17 +512,31 @@ abstract class CleanUp extends Transform with ast.TreeDSL { * constructor. */ case Template(parents, self, body) => localTyper = typer.atOwner(tree, currentClass) + var savedNewStaticMembers : mutable.Buffer[Tree] = null + var savedNewStaticInits : mutable.Buffer[Tree] = null + var savedSymbolsStoredAsStatic : mutable.Map[String, Symbol] = null + if(forMSIL) { + savedNewStaticMembers = newStaticMembers.clone + savedNewStaticInits = newStaticInits.clone + savedSymbolsStoredAsStatic = symbolsStoredAsStatic.clone + } newStaticMembers.clear newStaticInits.clear symbolsStoredAsStatic.clear - val transformedTemplate: Template = - if (!forMSIL || forMSIL) { - var newBody = - transformTrees(body) - treeCopy.Template(tree, parents, self, transformTrees(newStaticMembers.toList) ::: newBody) - } - else super.transform(tree).asInstanceOf[Template] - addStaticInits(transformedTemplate) // postprocess to include static ctors + val transformedTemplate: Template = { + var newBody = transformTrees(body) + treeCopy.Template(tree, parents, self, transformTrees(newStaticMembers.toList) ::: newBody) + } + val res = addStaticInits(transformedTemplate) // postprocess to include static ctors + newStaticMembers.clear + newStaticInits.clear + symbolsStoredAsStatic.clear + if(forMSIL) { + newStaticMembers ++= savedNewStaticMembers + newStaticInits ++= savedNewStaticInits + symbolsStoredAsStatic ++= savedSymbolsStoredAsStatic + } + res case Literal(c) if (c.tag == ClassTag) && !forMSIL=> val tpe = c.typeValue diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala index a9e4c01d9f..c1efe4843d 100644 --- a/src/compiler/scala/tools/nsc/transform/Constructors.scala +++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala @@ -70,7 +70,6 @@ abstract class Constructors extends Transform with ast.TreeDSL { } } - var thisRefSeen: Boolean = false var usesSpecializedField: Boolean = false // A transformer for expressions that go into the constructor @@ -78,6 +77,7 @@ abstract class Constructors extends Transform with ast.TreeDSL { def isParamRef(sym: Symbol) = sym.isParamAccessor && sym.owner == clazz && + !(clazz isSubClass DelayedInitClass) && !(sym.isGetter && sym.accessed.isVariable) && !sym.isSetter private def possiblySpecialized(s: Symbol) = specializeTypes.specializedTypeVars(s).nonEmpty @@ -95,16 +95,9 @@ abstract class Constructors extends Transform with ast.TreeDSL { // references to parameter accessor field of own class become references to parameters gen.mkAttributedIdent(parameter(tree.symbol)) setPos tree.pos case Select(_, _) => - thisRefSeen = true if (specializeTypes.specializedTypeVars(tree.symbol).nonEmpty) usesSpecializedField = true super.transform(tree) - case This(_) => - thisRefSeen = true - super.transform(tree) - case Super(_, _) => - thisRefSeen = true - super.transform(tree) case _ => super.transform(tree) } @@ -117,16 +110,8 @@ abstract class Constructors extends Transform with ast.TreeDSL { // Should tree be moved in front of super constructor call? def canBeMoved(tree: Tree) = tree match { - //todo: eliminate thisRefSeen - case ValDef(mods, _, _, _) => - if (settings.Xwarninit.value) - if (!(mods hasFlag PRESUPER | PARAMACCESSOR) && !thisRefSeen && - { val g = tree.symbol.getter(tree.symbol.owner); - g != NoSymbol && !g.allOverriddenSymbols.isEmpty - }) - unit.warning(tree.pos, "the semantics of this definition has changed;\nthe initialization is no longer be executed before the superclass is called") - (mods hasFlag PRESUPER | PARAMACCESSOR)// || !thisRefSeen && (!settings.future.value && !settings.checkInit.value) - case _ => false + case ValDef(mods, _, _, _) => (mods hasFlag PRESUPER | PARAMACCESSOR) + case _ => false } // Create an assignment to class field `to' with rhs `from' @@ -230,12 +215,13 @@ abstract class Constructors extends Transform with ast.TreeDSL { // the symbol is an outer accessor of a final class which does not override another outer accessor. ) def maybeOmittable(sym: Symbol) = sym.owner == clazz && ( sym.isParamAccessor && sym.isPrivateLocal || - sym.isOuterAccessor && sym.owner.isFinal && sym.allOverriddenSymbols.isEmpty + sym.isOuterAccessor && sym.owner.isFinal && sym.allOverriddenSymbols.isEmpty && + !(clazz isSubClass DelayedInitClass) ) // Is symbol known to be accessed outside of the primary constructor, // or is it a symbol whose definition cannot be omitted anyway? - def mustbeKept(sym: Symbol) = !maybeOmittable(sym) || accessedSyms(sym) + def mustbeKept(sym: Symbol) = !maybeOmittable(sym) || (accessedSyms contains sym) // A traverser to set accessedSyms and outerAccessors val accessTraverser = new Traverser { @@ -593,7 +579,10 @@ abstract class Constructors extends Transform with ast.TreeDSL { // Unlink all fields that can be dropped from class scope for (sym <- clazz.info.decls.toList) - if (!mustbeKept(sym)) clazz.info.decls unlink sym + if (!mustbeKept(sym)) { + // println("dropping "+sym+sym.locationString) + clazz.info.decls unlink sym + } // Eliminate all field definitions that can be dropped from template treeCopy.Template(impl, impl.parents, impl.self, diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index ca39ec4a4d..f9f2f94917 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -209,7 +209,7 @@ abstract class Erasure extends AddInterfaces !sym.isHigherOrderTypeParameter && sym.isTypeParameterOrSkolem && ( (initialSymbol.enclClassChain.exists(sym isNestedIn _)) || - traceSig.seq("isMethod", Seq(initialSymbol, initialSymbol.typeParams)) { + traceSig("isMethod", (initialSymbol, initialSymbol.typeParams)) { (initialSymbol.isMethod && initialSymbol.typeParams.contains(sym)) } ) @@ -229,7 +229,8 @@ abstract class Erasure extends AddInterfaces } } // for debugging signatures: traces logic given system property - private val traceSig = util.Tracer(sys.props contains "scalac.sigs.trace") + private val traceProp = sys.BooleanProp keyExists "scalac.sigs.trace" + private val traceSig = util.Tracer(traceProp) /** This object is only used for sanity testing when -check:genjvm is set. * In that case we make sure that the erasure of the `normalized' type @@ -356,7 +357,7 @@ abstract class Erasure extends AddInterfaces } else if (sym.isClass) { val preRebound = pre.baseType(sym.owner) // #2585 - traceSig.seq("sym.isClass", Seq(sym.ownerChain, preRebound, sym0.enclClassChain)) { + traceSig("sym.isClass", (sym.ownerChain, preRebound, sym0.enclClassChain)) { dotCleanup( ( if (needsJavaSig(preRebound)) { @@ -389,7 +390,7 @@ abstract class Erasure extends AddInterfaces def paramSig(tsym: Symbol) = tsym.name + boundSig(hiBounds(tsym.info.bounds)) val paramString = if (toplevel) tparams map paramSig mkString ("<", "", ">") else "" - traceSig.seq("PolyType", Seq(tparams, restpe))(paramString + jsig(restpe)) + traceSig("PolyType", (tparams, restpe))(paramString + jsig(restpe)) case MethodType(params, restpe) => "("+(params map (_.tpe) map (jsig(_))).mkString+")"+ (if (restpe.typeSymbol == UnitClass || sym0.isConstructor) VOID_TAG.toString else jsig(restpe)) @@ -408,7 +409,7 @@ abstract class Erasure extends AddInterfaces else jsig(etp) } } - traceSig.seq("javaSig", Seq(sym0, info)) { + traceSig("javaSig", (sym0, info)) { if (needsJavaSig(info)) { try Some(jsig(info, toplevel = true)) catch { case ex: UnknownSig => None } diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala index ad6ccaff59..b52419f7ca 100644 --- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala +++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala @@ -51,9 +51,6 @@ abstract class LiftCode extends Transform with Reifiers { def className(value: AnyRef): String = value match { case _ :: _ => "scala.$colon$colon" case reflect.MethodType(_, _) => - if (value.isInstanceOf[reflect.ImplicitMethodType]) - "scala.reflect.ImplicitMethodType" - else "scala.reflect.MethodType" case x:Product => "scala.reflect."+x.productPrefix //caseName diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index cd845ab9e5..f966e1476c 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -783,9 +783,9 @@ trait Namers { self: Analyzer => // if default getters (for constructor defaults) need to be added to that module, here's the namer // to use. clazz is the ModuleClass. sourceModule works also for classes defined in methods. val module = clazz.sourceModule - if (classAndNamerOfModule contains module) { - val (cdef, _) = classAndNamerOfModule(module) - classAndNamerOfModule(module) = (cdef, templateNamer) + classAndNamerOfModule get module match { + case Some((cdef, _)) => classAndNamerOfModule(module) = (cdef, templateNamer) + case None => } if (opt.verbose) { @@ -1008,11 +1008,14 @@ trait Namers { self: Analyzer => val module = companionModuleOf(meth.owner, context) module.initialize // call type completer (typedTemplate), adds the // module's templateNamer to classAndNamerOfModule - if (!classAndNamerOfModule.contains(module)) - return // fix #3649 (prevent crash in erroneous source code) - val (cdef, nmr) = classAndNamerOfModule(module) - moduleNamer = Some(cdef, nmr) - (cdef, nmr) + classAndNamerOfModule get module match { + case s @ Some((cdef, nmr)) if nmr != null => + moduleNamer = s + (cdef, nmr) + case _ => + return // fix #3649 (prevent crash in erroneous source code) + // nmr == null can happen in IDE; this is really an ugly hack on top[ of an ugly hack but it seems to work + } } deftParams = cdef.tparams map copyUntypedInvariant nmr diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 63542e6dd5..3eb5107870 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -352,7 +352,7 @@ abstract class RefChecks extends InfoTransform { } else if ((member hasFlag (OVERRIDE | ABSOVERRIDE)) && !(member.owner.thisType.baseClasses exists (_ isSubClass other.owner)) && !member.isDeferred && !other.isDeferred && - intersectionIsEmpty(member.allOverriddenSymbols, other.allOverriddenSymbols)) { + intersectionIsEmpty(member.extendedOverriddenSymbols, other.extendedOverriddenSymbols)) { overrideError("cannot override a concrete member without a third member that's overridden by both "+ "(this rule is designed to prevent ``accidental overrides'')") } else if (other.isStable && !member.isStable) { // (1.4) @@ -550,6 +550,13 @@ abstract class RefChecks extends InfoTransform { if (abstractErrors.nonEmpty) unit.error(clazz.pos, abstractErrorMessage) + } else if (clazz.isTrait) { + // prevent abstract methods in interfaces that override final members in Object; see #4431 + for (decl <- clazz.info.decls.iterator) { + val overridden = decl.overriddenSymbol(ObjectClass) + if (overridden.isFinal) + unit.error(decl.pos, "trait cannot redefine final method from class AnyRef") + } } /** Returns whether there is a symbol declared in class `inclazz` diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 83d72fc3a0..240f0c5f12 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -125,7 +125,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT // otherwise lead to either a compiler crash or runtime failure. private lazy val isDisallowed = { import definitions._ - Set(Any_isInstanceOf, Object_isInstanceOf, Object_==, Object_!=, Object_##) + Set(Any_isInstanceOf, Object_isInstanceOf, Any_asInstanceOf, Object_asInstanceOf, Object_==, Object_!=, Object_##) } override def transform(tree: Tree): Tree = { diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 08d5f0e12d..3afbc5640b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1647,7 +1647,8 @@ trait Typers extends Modes { namer.enterSyms(trees) typedStats(trees, NoSymbol) useCase.defined = context.scope.toList filterNot (useCase.aliases contains _) -// println("defined use cases: "+(useCase.defined map (sym => sym+":"+sym.tpe))) + if (settings.debug.value) + useCase.defined foreach (sym => println("defined use cases: %s:%s".format(sym, sym.tpe))) } /** @@ -2523,13 +2524,22 @@ trait Typers extends Modes { /** Calling constfold right here is necessary because some trees (negated * floats and literals in particular) are not yet folded. */ - def tryConst(tr: Tree, pt: Type) = typed(constfold(tr), EXPRmode, pt) match { - // null cannot be used as constant value for classfile annotations - case l @ Literal(c) if !(l.isErroneous || c.value == null) => - Some(LiteralAnnotArg(c)) - case _ => - error(tr.pos, "annotation argument needs to be a constant; found: "+tr) - None + def tryConst(tr: Tree, pt: Type): Option[LiteralAnnotArg] = { + val const: Constant = typed(constfold(tr), EXPRmode, pt) match { + case l @ Literal(c) if !l.isErroneous => c + case tree => tree.tpe match { + case ConstantType(c) => c + case tpe => null + } + } + def fail(msg: String) = { error(tr.pos, msg) ; None } + + if (const == null) + fail("annotation argument needs to be a constant; found: " + tr) + else if (const.value == null) + fail("annotation argument cannot be null") + else + Some(LiteralAnnotArg(const)) } /** Converts an untyped tree to a ClassfileAnnotArg. If the conversion fails, @@ -2575,7 +2585,7 @@ trait Typers extends Modes { def trees2ConstArg(trees: List[Tree], pt: Type): Option[ArrayAnnotArg] = { val args = trees.map(tree2ConstArg(_, pt)) if (args.exists(_.isEmpty)) None - else Some(ArrayAnnotArg(args.map(_.get).toArray)) + else Some(ArrayAnnotArg(args.flatten.toArray)) } // begin typedAnnotation diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala index bb404480a9..962062eb2d 100644 --- a/src/compiler/scala/tools/nsc/util/ClassPath.scala +++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala @@ -9,9 +9,9 @@ package util import java.net.URL import scala.collection.mutable.ListBuffer -import io.{ File, Directory, Path, AbstractFile } +import io.{ File, Directory, Path, Jar, AbstractFile, ClassAndJarInfo } import scala.tools.util.StringOps.splitWhere -import Path.isJarOrZip +import Jar.isJarOrZip import File.pathSeparator /** <p> @@ -22,6 +22,14 @@ import File.pathSeparator * @author Stepan Koltsov */ object ClassPath { + def scalaLibrary = locate[ScalaObject] + def scalaCompiler = locate[Global] + + def info[T: ClassManifest] = new ClassAndJarInfo[T] + def locate[T: ClassManifest] = info[T] rootClasspath + def locateJar[T: ClassManifest] = info[T].rootPossibles find (x => isJarOrZip(x)) map (x => File(x)) + def locateDir[T: ClassManifest] = info[T].rootPossibles find (_.isDirectory) map (_.toDirectory) + /** Expand single path entry */ private def expandS(pattern: String): List[String] = { val wildSuffix = File.separator + "*" diff --git a/src/compiler/scala/tools/nsc/util/InterruptReq.scala b/src/compiler/scala/tools/nsc/util/InterruptReq.scala index 342284fb70..2857823ceb 100644 --- a/src/compiler/scala/tools/nsc/util/InterruptReq.scala +++ b/src/compiler/scala/tools/nsc/util/InterruptReq.scala @@ -24,7 +24,7 @@ abstract class InterruptReq { notify() } - /** To be called from interrupting client to get result fo interrupt */ + /** To be called from interrupting client to get result for interrupt */ def getResult(): R = synchronized { while (result.isEmpty) { try { @@ -34,7 +34,9 @@ abstract class InterruptReq { result.get match { case Left(res) => res - case Right(t) => throw t + case Right(t) => throw new FailedInterrupt(t) } } } + +class FailedInterrupt(cause: Throwable) extends Exception("Compiler exception during call to 'ask'", cause) diff --git a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala index be69c39547..d6d19eef92 100644 --- a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala +++ b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala @@ -37,12 +37,8 @@ trait ScalaClassLoader extends JavaClassLoader { Class.forName(path, initialize, this).asInstanceOf[Class[T]] /** Create an instance of a class with this classloader */ - def create(path: String): AnyRef = { - tryToInitializeClass(path) match { - case Some(clazz) => clazz.newInstance() - case None => null - } - } + def create(path: String): AnyRef = + tryToInitializeClass[AnyRef](path) map (_.newInstance()) orNull override def findClass(name: String) = { val result = super.findClass(name) @@ -60,14 +56,15 @@ trait ScalaClassLoader extends JavaClassLoader { manifest[T].erasure.getConstructors.toList map (_.asInstanceOf[Constructor[T]]) /** The actual bytes for a class file, or an empty array if it can't be found. */ - def findBytesForClassName(s: String): Array[Byte] = { - val name = s.replaceAll("""\.""", "/") + ".class" - val url = this.getResource(name) - - if (url == null) Array() - else io.Streamable.bytes(url.openStream) + def classBytes(className: String): Array[Byte] = classAsStream(className) match { + case null => Array() + case stream => io.Streamable.bytes(stream) } + /** An InputStream representing the given class name, or null if not found. */ + def classAsStream(className: String) = + getResourceAsStream(className.replaceAll("""\.""", "/") + ".class") + /** Run the main method of a class to be loaded by this classloader */ def run(objectName: String, arguments: Seq[String]) { val clsToRun = tryToInitializeClass(objectName) getOrElse ( diff --git a/src/compiler/scala/tools/nsc/util/ShowPickled.scala b/src/compiler/scala/tools/nsc/util/ShowPickled.scala index 476e0944cd..a8499fc6a7 100644 --- a/src/compiler/scala/tools/nsc/util/ShowPickled.scala +++ b/src/compiler/scala/tools/nsc/util/ShowPickled.scala @@ -76,7 +76,7 @@ object ShowPickled extends Names { case CLASSINFOtpe => "CLASSINFOtpe" case METHODtpe => "METHODtpe" case POLYtpe => "POLYtpe" - case IMPLICITMETHODtpe => "IMPLICITMETHODtpe" + case IMPLICITMETHODtpe => "METHODtpe" // IMPLICITMETHODtpe no longer used. case SUPERtpe => "SUPERtpe" case LITERALunit => "LITERALunit" case LITERALboolean => "LITERALboolean" diff --git a/src/compiler/scala/tools/nsc/util/Tracer.scala b/src/compiler/scala/tools/nsc/util/Tracer.scala index 17be05a4d6..1dd21b26c2 100644 --- a/src/compiler/scala/tools/nsc/util/Tracer.scala +++ b/src/compiler/scala/tools/nsc/util/Tracer.scala @@ -6,31 +6,56 @@ package scala.tools.nsc package util +import java.io.PrintStream + class Tracer(enabled: () => Boolean) { + def out: PrintStream = System.out + def intoString(x: Any): String = "" + x + def stringify(x: Any): String = x match { + case null => "null" + case x: TraversableOnce[_] => x map stringify mkString ", " + case x: Product => stringify(x.productIterator) + case x: AnyRef => intoString(x) + } + + private val LBRACE = "{" + private val RBRACE = "}" private var indentLevel = 0 - private def ind(s: String) = (" " * (indentLevel*2)) + s + private def ind(s: String) = (" " * (indentLevel * 2)) + s private def indented[T](body: => T): T = { indentLevel += 1 try body finally indentLevel -= 1 } private def p(s: String) = { - System.out.print(s) - System.out.flush() + out.print(s) + out.flush() } private def pin[T](x: T): T = { p(ind("" + x)) x } - def seq[T](name: String, args: => Seq[Any])(body: => T): T = { + def apply[T](name: String, args: => Any)(body: => T): T = { + val result = body if (enabled()) { - p(ind("%s(%s) = {\n".format(name, args mkString ", "))) - try indented(pin(body)) - finally println("\n" + ind("}")) + // concise output optimization + val boolResult = result match { + case x: Boolean => Some(x) + case _ => None + } + p(ind("%s(%s) = %s\n".format( + name, + stringify(args), + boolResult getOrElse LBRACE)) + ) + if (boolResult.isEmpty) { + indented(pin(result)) + p("\n" + ind(RBRACE)) + } + result } - else body + else result } - def apply[T](name: String, args: Any*)(body: => T): T = seq(name, args.toSeq)(body) } object Tracer { diff --git a/src/compiler/scala/tools/util/Javap.scala b/src/compiler/scala/tools/util/Javap.scala index bda8ffbd1b..581cc9dbef 100644 --- a/src/compiler/scala/tools/util/Javap.scala +++ b/src/compiler/scala/tools/util/Javap.scala @@ -77,7 +77,7 @@ class Javap( if (path endsWith ".class") (path dropRight 6).replace('/', '.') else path ) - loader.findBytesForClassName(extName) + loader.classBytes(extName) } } diff --git a/src/library-aux/README b/src/library-aux/README new file mode 100644 index 0000000000..e6dcd29277 --- /dev/null +++ b/src/library-aux/README @@ -0,0 +1,3 @@ +Source files under this directory cannot be compiled by normal means. + +They exist for bootstrapping and documentation purposes.
\ No newline at end of file diff --git a/src/library-aux/scala/Any.scala b/src/library-aux/scala/Any.scala new file mode 100644 index 0000000000..a97e5f050b --- /dev/null +++ b/src/library-aux/scala/Any.scala @@ -0,0 +1,105 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** Class `Any` is the root of the Scala class hierarchy. Every class in a Scala + * execution environment inherits directly or indirectly from this class. + */ +abstract class Any { + /** Compares the receiver object (`this`) with the argument object (`that`) for equivalence. + * + * The default implementations of this method is an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]]: + * + * - It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`. + * - It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and + * only if `y.equals(x)` returns `true`. + * - It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and + * `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`. + * + * If you override this method, you should verify that your implementation remains an equivalence relation. + * Additionally, when overriding this method it is usually necessary to override `hashCode` to ensure that + * objects which are "equal" (`o1.equals(o2)` returns `true`) hash to the same [[scala.Int]]. + * (`o1.hashCode.equals(o2.hashCode)`). + * + * @param that the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + def equals(that: Any): Boolean + + /** Calculate a hash code value for the object. + * + * The default hashing algorithm is platform dependent. + * + * Note that it is allowed for two objects to have identical hash codes (`o1.hashCode.equals(o2.hashCode)`) yet + * not be equal (`o1.equals(o2)` returns `false`). A degenerate implementation could always return `0`. + * However, it is required that if two objects are equal (`o1.equals(o2)` returns `true`) that they have + * identical hash codes (`o1.hashCode.equals(o2.hashCode)`). Therefore, when overriding this method, be sure + * to verify that the behavior is consistent with the `equals` method. + * + * @return the hash code value for this object. + */ + def hashCode: Int + + /** Returns a string representation of the object. + * + * The default representation is platform dependent. + * + * @return a string representation of the object. + */ + def toString: String + + /** Test two objects for equality. + * + * @param that the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + final def ==(that: Any): Boolean = this equals that + + /** Test two objects for inequality. + * + * @param that the object to compare against this object for equality. + * @return `true` if !(this == that), false otherwise. + */ + final def != (that: Any): Boolean = !(this == that) + + /** Equivalent to `x.hashCode` except for boxed numeric types. + * For numerics, it returns a hash value which is consistent + * with value equality: if two value type instances compare + * as true, then ## will produce the same hash value for each + * of them. + * + * @return a hash value consistent with == + */ + final def ## : Int = sys.error("##") + + /** Test whether the dynamic type of the receiver object is `T0`. + * + * Note that the result of the test is modulo Scala's erasure semantics. + * Therefore the expression `1.isInstanceOf[String]` will return `false`, while the + * expression `List(1).isInstanceOf[List[String]]` will return `true`. + * In the latter example, because the type argument is erased as part of compilation it is + * not possible to check whether the contents of the list are of the specified type. + * + * @return `true` if the receiver object is an instance of erasure of type `T0`; `false` otherwise. + */ + def isInstanceOf[T0]: Boolean = sys.error("isInstanceOf") + + /** Cast the receiver object to be of type `T0`. + * + * Note that the success of a cast at runtime is modulo Scala's erasure semantics. + * Therefore the expression `1.asInstanceOf[String]` will throw a `ClassCastException` at + * runtime, while the expression `List(1).asInstanceOf[List[String]]` will not. + * In the latter example, because the type argument is erased as part of compilation it is + * not possible to check whether the contents of the list are of the requested type. + * + * @throws ClassCastException if the receiver object is not an instance of the erasure of type `T0`. + * @return the receiver object. + */ + def asInstanceOf[T0]: T0 = sys.error("asInstanceOf") +} diff --git a/src/library-aux/scala/AnyRef.scala b/src/library-aux/scala/AnyRef.scala new file mode 100644 index 0000000000..6792ba68b7 --- /dev/null +++ b/src/library-aux/scala/AnyRef.scala @@ -0,0 +1,129 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** Class `AnyRef` is the root class of all ''reference types''. + * All types except the value types descend from this class. + */ +trait AnyRef extends Any { + + /** The equality method for reference types. See equals in [[scala.Any]]. + * + * @param that the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + def equals(that: Any): Boolean = this eq that + + /** The hashCode method for reference types. See hashCode in [[scala.Any]]. + * + * @return the hash code value for this object. + */ + def hashCode: Int = sys.error("hashCode") + + /** Creates a String representation of this object. The default + * representation is platform dependent. On the java platform it + * is the concatenation of the class name, "@", and the object's + * hashcode in hexadecimal. + * + * @return a String representation of the object. + */ + def toString: String = sys.error("toString") + + /** Executes the code in `body` with an exclusive lock on `this`. + * + * @param body the code to execute + * @return the result of `body` + */ + def synchronized[T](body: => T): T + + /** Tests whether the argument (`arg0`) is a reference to the receiver object (`this`). + * + * The `eq` method implements an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]] on + * non-null instances of `AnyRef`, and has three additional properties: + * + * - It is consistent: for any non-null instances `x` and `y` of type `AnyRef`, multiple invocations of + * `x.eq(y)` consistently returns `true` or consistently returns `false`. + * - For any non-null instance `x` of type `AnyRef`, `x.eq(null)` and `null.eq(x)` returns `false`. + * - `null.eq(null)` returns `true`. + * + * When overriding the `equals` or `hashCode` methods, it is important to ensure that their behavior is + * consistent with reference equality. Therefore, if two objects are references to each other (`o1 eq o2`), they + * should be equal to each other (`o1 == o2`) and they should hash to the same value (`o1.hashCode == o2.hashCode`). + * + * @param that the object to compare against this object for reference equality. + * @return `true` if the argument is a reference to the receiver object; `false` otherwise. + */ + final def eq(that: AnyRef): Boolean = sys.error("eq") + + /** Equivalent to `!(this eq that)`. + * + * @param that the object to compare against this object for reference equality. + * @return `true` if the argument is not a reference to the receiver object; `false` otherwise. + */ + final def ne(that: AnyRef): Boolean = !(this eq that) + + /** The expression `x == that` is equivalent to `if (x eq null) that eq null else x.equals(that)`. + * + * @param arg0 the object to compare against this object for equality. + * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. + */ + final def ==(that: AnyRef): Boolean = + if (this eq null) that eq null + else this equals that + + /** Create a copy of the receiver object. + * + * The default implementation of the `clone` method is platform dependent. + * + * @note not specified by SLS as a member of AnyRef + * @return a copy of the receiver object. + */ + protected def clone(): AnyRef + + /** Called by the garbage collector on the receiver object when there + * are no more references to the object. + * + * The details of when and if the `finalize` method is invoked, as + * well as the interaction between `finalize` and non-local returns + * and exceptions, are all platform dependent. + * + * @note not specified by SLS as a member of AnyRef + */ + protected def finalize(): Unit + + /** A representation that corresponds to the dynamic class of the receiver object. + * + * The nature of the representation is platform dependent. + * + * @note not specified by SLS as a member of AnyRef + * @return a representation that corresponds to the dynamic class of the receiver object. + */ + def getClass(): Class[_] + + /** Wakes up a single thread that is waiting on the receiver object's monitor. + * + * @note not specified by SLS as a member of AnyRef + */ + def notify(): Unit + + /** Wakes up all threads that are waiting on the receiver object's monitor. + * + * @note not specified by SLS as a member of AnyRef + */ + def notifyAll(): Unit + + /** Causes the current Thread to wait until another Thread invokes + * the notify() or notifyAll() methods. + * + * @note not specified by SLS as a member of AnyRef + */ + def wait (): Unit + def wait (timeout: Long, nanos: Int): Unit + def wait (timeout: Long): Unit +} diff --git a/src/library-aux/scala/Nothing.scala b/src/library-aux/scala/Nothing.scala new file mode 100644 index 0000000000..eed6066039 --- /dev/null +++ b/src/library-aux/scala/Nothing.scala @@ -0,0 +1,23 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** `Nothing` is - together with [[scala.Null]] - at the bottom of Scala's type hierarchy. + * + * `Nothing` is a subtype of every other type (including [[scala.Null]]); there exist + * ''no instances'' of this type. Although type `Nothing` is uninhabited, it is + * nevertheless useful in several ways. For instance, the Scala library defines a value + * [[scala.collection.immutable.Nil]] of type `List[Nothing]`. Because lists are covariant in Scala, + * this makes [[scala.collection.immutable.Nil]] an instance of `List[T]`, for any element of type `T`. + * + * Another usage for Nothing is the return type for methods which never return normally. + * One example is method error in [[scala.sys]], which always throws an exception. + */ +sealed trait Nothing + diff --git a/src/library-aux/scala/Null.scala b/src/library-aux/scala/Null.scala new file mode 100644 index 0000000000..7455e78ae7 --- /dev/null +++ b/src/library-aux/scala/Null.scala @@ -0,0 +1,17 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala + +/** `Null` is - together with [[scala.Nothing]] - at the bottom of the Scala type hierarchy. + * + * `Null` is a subtype of all reference types; its only instance is the `null` reference. + * Since `Null` is not a subtype of value types, `null` is not a member of any such type. For instance, + * it is not possible to assign `null` to a variable of type [[scala.Int]]. + */ +sealed trait Null diff --git a/src/library/scala/AnyVal.scala b/src/library/scala/AnyVal.scala index 4b4b6038d1..850042700f 100755 --- a/src/library/scala/AnyVal.scala +++ b/src/library/scala/AnyVal.scala @@ -8,4 +8,21 @@ package scala +/** `AnyVal` is the root class of all ''value types'', which describe values + * not implemented as objects in the underlying host system. The value classes + * are specified in SLS 12.2. + * + * The standard implementation includes nine `AnyVal` subtypes: + * + * [[scala.Double]], [[scala.Float]], [[scala.Long]], [[scala.Int]], [[scala.Char]], + * [[scala.Short]], and [[scala.Byte]] are the ''numeric value types''. + * + * [[scala.Unit]] and [[scala.Boolean]] are the ''non-numeric value types''. + * + * Other groupings: + * + * The ''subrange types'' are [[scala.Byte]], [[scala.Short]], and [[scala.Char]]. + * The ''integer types'' include the subrange types as well as [[scala.Int]] and [[scala.Long]]. + * The ''floating point types'' are [[scala.Float]] and [[scala.Double]]. + */ sealed trait AnyVal diff --git a/src/library/scala/Boolean.scala b/src/library/scala/Boolean.scala index dc2076cb1d..7719065ae7 100755 --- a/src/library/scala/Boolean.scala +++ b/src/library/scala/Boolean.scala @@ -10,8 +10,12 @@ package scala -import java.{ lang => jl } - +/** `Boolean` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Boolean]] => [[scala.runtime.RichBoolean]] + * which provides useful non-primitive operations. + */ final class Boolean extends AnyVal { def unary_! : Boolean = sys.error("stub") @@ -28,7 +32,26 @@ final class Boolean extends AnyVal { } object Boolean extends AnyValCompanion { + + /** Transform a value type into a boxed reference type. + * + * @param x the Boolean to be boxed + * @return a java.lang.Boolean offering `x` as its underlying value. + */ + def box(x: Boolean): java.lang.Boolean = java.lang.Boolean.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Boolean. + * + * @param x the java.lang.Boolean to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Boolean + * @return the Boolean resulting from calling booleanValue() on `x` + */ + def unbox(x: java.lang.Object): Boolean = x.asInstanceOf[java.lang.Boolean].booleanValue() + + /** The String representation of the scala.Boolean companion object. + */ override def toString = "object scala.Boolean" - def box(x: Boolean): jl.Boolean = jl.Boolean.valueOf(x) - def unbox(x: jl.Object): Boolean = x.asInstanceOf[jl.Boolean].booleanValue() -}
\ No newline at end of file +} + diff --git a/src/library/scala/Byte.scala b/src/library/scala/Byte.scala index 69d435b33b..540e05c19f 100644 --- a/src/library/scala/Byte.scala +++ b/src/library/scala/Byte.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Byte` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Byte]] => [[scala.runtime.RichByte]] + * which provides useful non-primitive operations. + */ final class Byte extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Byte extends AnyVal { } - object Byte extends AnyValCompanion { - final val MinValue = jl.Byte.MIN_VALUE - final val MaxValue = jl.Byte.MAX_VALUE - - def box(x: Byte): jl.Byte = jl.Byte.valueOf(x) - def unbox(x: jl.Object): Byte = x.asInstanceOf[jl.Byte].byteValue() + /** The smallest value representable as a Byte. + */ + final val MinValue = java.lang.Byte.MIN_VALUE + + /** The largest value representable as a Byte. + */ + final val MaxValue = java.lang.Byte.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Byte to be boxed + * @return a java.lang.Byte offering `x` as its underlying value. + */ + def box(x: Byte): java.lang.Byte = java.lang.Byte.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Byte. + * + * @param x the java.lang.Byte to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Byte + * @return the Byte resulting from calling byteValue() on `x` + */ + def unbox(x: java.lang.Object): Byte = x.asInstanceOf[java.lang.Byte].byteValue() + + /** The String representation of the scala.Byte companion object. + */ override def toString = "object scala.Byte" } + diff --git a/src/library/scala/Char.scala b/src/library/scala/Char.scala index 88d7617ea5..a5d1cb019b 100644 --- a/src/library/scala/Char.scala +++ b/src/library/scala/Char.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Char` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Char]] => [[scala.runtime.RichChar]] + * which provides useful non-primitive operations. + */ final class Char extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Char extends AnyVal { } - object Char extends AnyValCompanion { - final val MinValue = jl.Character.MIN_VALUE - final val MaxValue = jl.Character.MAX_VALUE - - def box(x: Char): jl.Character = jl.Character.valueOf(x) - def unbox(x: jl.Object): Char = x.asInstanceOf[jl.Character].charValue() + /** The smallest value representable as a Char. + */ + final val MinValue = java.lang.Character.MIN_VALUE + + /** The largest value representable as a Char. + */ + final val MaxValue = java.lang.Character.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Char to be boxed + * @return a java.lang.Character offering `x` as its underlying value. + */ + def box(x: Char): java.lang.Character = java.lang.Character.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Character. + * + * @param x the java.lang.Character to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Character + * @return the Char resulting from calling charValue() on `x` + */ + def unbox(x: java.lang.Object): Char = x.asInstanceOf[java.lang.Character].charValue() + + /** The String representation of the scala.Char companion object. + */ override def toString = "object scala.Char" } + diff --git a/src/library/scala/Double.scala b/src/library/scala/Double.scala index fe37860c07..6fd7b0984b 100644 --- a/src/library/scala/Double.scala +++ b/src/library/scala/Double.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Double` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Double]] => [[scala.runtime.RichDouble]] + * which provides useful non-primitive operations. + */ final class Double extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -117,13 +120,14 @@ final class Double extends AnyVal { } - object Double extends AnyValCompanion { - /** The smallest positive value greater than 0.0d.*/ - final val MinPositiveValue = jl.Double.MIN_VALUE - final val NaN = jl.Double.NaN - final val PositiveInfinity = jl.Double.POSITIVE_INFINITY - final val NegativeInfinity = jl.Double.NEGATIVE_INFINITY + /** The smallest positive value greater than 0.0d which is + * representable as a Double. + */ + final val MinPositiveValue = java.lang.Double.MIN_VALUE + final val NaN = java.lang.Double.NaN + final val PositiveInfinity = java.lang.Double.POSITIVE_INFINITY + final val NegativeInfinity = java.lang.Double.NEGATIVE_INFINITY @deprecated("use Double.MinPositiveValue instead") final val Epsilon = MinPositiveValue @@ -133,12 +137,30 @@ object Double extends AnyValCompanion { * is the smallest positive value representable by a Double. In Scala that number * is called Double.MinPositiveValue. */ - final val MinValue = -jl.Double.MAX_VALUE + final val MinValue = -java.lang.Double.MAX_VALUE /** The largest finite positive number representable as a Double. */ - final val MaxValue = jl.Double.MAX_VALUE + final val MaxValue = java.lang.Double.MAX_VALUE - def box(x: Double): jl.Double = jl.Double.valueOf(x) - def unbox(x: jl.Object): Double = x.asInstanceOf[jl.Double].doubleValue() + /** Transform a value type into a boxed reference type. + * + * @param x the Double to be boxed + * @return a java.lang.Double offering `x` as its underlying value. + */ + def box(x: Double): java.lang.Double = java.lang.Double.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Double. + * + * @param x the java.lang.Double to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Double + * @return the Double resulting from calling doubleValue() on `x` + */ + def unbox(x: java.lang.Object): Double = x.asInstanceOf[java.lang.Double].doubleValue() + + /** The String representation of the scala.Double companion object. + */ override def toString = "object scala.Double" } + diff --git a/src/library/scala/Dynamic.scala b/src/library/scala/Dynamic.scala index 25ce4ef638..2f99518988 100644 --- a/src/library/scala/Dynamic.scala +++ b/src/library/scala/Dynamic.scala @@ -2,11 +2,12 @@ package scala /** A marker trait that enables dynamic invocations. Instances `x` of this trait * allow calls `x.meth(args)` for arbitrary method names `meth` and argument lists - * `args`. If a call is not natively supported by `x`, it is rewritten to + * `args`. If a call is not natively supported by `x`, it is rewritten to * `x.applyDynamic("meth", args)`. + * + * As of scala 2.9, scalac must receive the -Xexperimental optional for Dynamic + * to receive this treatment. */ -trait Dynamic { - -} +trait Dynamic diff --git a/src/library/scala/Equals.scala b/src/library/scala/Equals.scala index d0929a9ac4..8aff7af175 100644 --- a/src/library/scala/Equals.scala +++ b/src/library/scala/Equals.scala @@ -6,22 +6,22 @@ ** |/ ** \* */ - - package scala /** An interface containing operations for equality. * The only method not already present in class `AnyRef` is `canEqual`. */ trait Equals { - /** A method that should be called from every well-designed equals method * that is open to be overridden in a subclass. See Programming in Scala, * Chapter 28 for discussion and design. + * + * @param that the value being probed for possible equality + * @return true if this instance can possibly equal `that`, otherwise false */ def canEqual(that: Any): Boolean - /** The equality method defined in `AnyRef`. + /** The universal equality method defined in `AnyRef`. */ def equals(that: Any): Boolean } diff --git a/src/library/scala/Float.scala b/src/library/scala/Float.scala index 39e510e477..38819e5d16 100644 --- a/src/library/scala/Float.scala +++ b/src/library/scala/Float.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Float` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Float]] => [[scala.runtime.RichFloat]] + * which provides useful non-primitive operations. + */ final class Float extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -117,13 +120,14 @@ final class Float extends AnyVal { } - object Float extends AnyValCompanion { - /** The smallest positive value greater than 0.0f.*/ - final val MinPositiveValue = jl.Float.MIN_VALUE - final val NaN = jl.Float.NaN - final val PositiveInfinity = jl.Float.POSITIVE_INFINITY - final val NegativeInfinity = jl.Float.NEGATIVE_INFINITY + /** The smallest positive value greater than 0.0f which is + * representable as a Float. + */ + final val MinPositiveValue = java.lang.Float.MIN_VALUE + final val NaN = java.lang.Float.NaN + final val PositiveInfinity = java.lang.Float.POSITIVE_INFINITY + final val NegativeInfinity = java.lang.Float.NEGATIVE_INFINITY @deprecated("use Float.MinPositiveValue instead") final val Epsilon = MinPositiveValue @@ -133,12 +137,30 @@ object Float extends AnyValCompanion { * is the smallest positive value representable by a Float. In Scala that number * is called Float.MinPositiveValue. */ - final val MinValue = -jl.Float.MAX_VALUE + final val MinValue = -java.lang.Float.MAX_VALUE /** The largest finite positive number representable as a Float. */ - final val MaxValue = jl.Float.MAX_VALUE + final val MaxValue = java.lang.Float.MAX_VALUE - def box(x: Float): jl.Float = jl.Float.valueOf(x) - def unbox(x: jl.Object): Float = x.asInstanceOf[jl.Float].floatValue() + /** Transform a value type into a boxed reference type. + * + * @param x the Float to be boxed + * @return a java.lang.Float offering `x` as its underlying value. + */ + def box(x: Float): java.lang.Float = java.lang.Float.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Float. + * + * @param x the java.lang.Float to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Float + * @return the Float resulting from calling floatValue() on `x` + */ + def unbox(x: java.lang.Object): Float = x.asInstanceOf[java.lang.Float].floatValue() + + /** The String representation of the scala.Float companion object. + */ override def toString = "object scala.Float" } + diff --git a/src/library/scala/Function0.scala b/src/library/scala/Function0.scala index d17122c0d8..f8e68a2e04 100644 --- a/src/library/scala/Function0.scala +++ b/src/library/scala/Function0.scala @@ -6,7 +6,7 @@ ** |/ ** \* */ // GENERATED CODE: DO NOT EDIT. -// genprod generated these sources at: Sat Feb 19 20:13:51 PST 2011 +// genprod generated these sources at: Wed Mar 30 13:47:19 PDT 2011 package scala diff --git a/src/library/scala/Function1.scala b/src/library/scala/Function1.scala index e256a94961..dc8e67bbb0 100644 --- a/src/library/scala/Function1.scala +++ b/src/library/scala/Function1.scala @@ -25,6 +25,7 @@ package scala * } * }}} */ +@annotation.implicitNotFound(msg = "No implicit view available from ${T1} => ${R}.") trait Function1[@specialized(scala.Int, scala.Long, scala.Float, scala.Double) -T1, @specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) +R] extends AnyRef { self => /** Apply the body of this function to the argument. * @return the result of function application. diff --git a/src/library/scala/Int.scala b/src/library/scala/Int.scala index 69fb0a66b7..c53be1241d 100644 --- a/src/library/scala/Int.scala +++ b/src/library/scala/Int.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Int` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Int]] => [[scala.runtime.RichInt]] + * which provides useful non-primitive operations. + */ final class Int extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Int extends AnyVal { } - object Int extends AnyValCompanion { - final val MinValue = jl.Integer.MIN_VALUE - final val MaxValue = jl.Integer.MAX_VALUE - - def box(x: Int): jl.Integer = jl.Integer.valueOf(x) - def unbox(x: jl.Object): Int = x.asInstanceOf[jl.Integer].intValue() + /** The smallest value representable as a Int. + */ + final val MinValue = java.lang.Integer.MIN_VALUE + + /** The largest value representable as a Int. + */ + final val MaxValue = java.lang.Integer.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Int to be boxed + * @return a java.lang.Integer offering `x` as its underlying value. + */ + def box(x: Int): java.lang.Integer = java.lang.Integer.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Integer. + * + * @param x the java.lang.Integer to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Integer + * @return the Int resulting from calling intValue() on `x` + */ + def unbox(x: java.lang.Object): Int = x.asInstanceOf[java.lang.Integer].intValue() + + /** The String representation of the scala.Int companion object. + */ override def toString = "object scala.Int" } + diff --git a/src/library/scala/Long.scala b/src/library/scala/Long.scala index 7fdefebae3..3124130663 100644 --- a/src/library/scala/Long.scala +++ b/src/library/scala/Long.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Long` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Long]] => [[scala.runtime.RichLong]] + * which provides useful non-primitive operations. + */ final class Long extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Long extends AnyVal { } - object Long extends AnyValCompanion { - final val MinValue = jl.Long.MIN_VALUE - final val MaxValue = jl.Long.MAX_VALUE - - def box(x: Long): jl.Long = jl.Long.valueOf(x) - def unbox(x: jl.Object): Long = x.asInstanceOf[jl.Long].longValue() + /** The smallest value representable as a Long. + */ + final val MinValue = java.lang.Long.MIN_VALUE + + /** The largest value representable as a Long. + */ + final val MaxValue = java.lang.Long.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Long to be boxed + * @return a java.lang.Long offering `x` as its underlying value. + */ + def box(x: Long): java.lang.Long = java.lang.Long.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Long. + * + * @param x the java.lang.Long to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Long + * @return the Long resulting from calling longValue() on `x` + */ + def unbox(x: java.lang.Object): Long = x.asInstanceOf[java.lang.Long].longValue() + + /** The String representation of the scala.Long companion object. + */ override def toString = "object scala.Long" } + diff --git a/src/library/scala/Option.scala b/src/library/scala/Option.scala index ef2cbcfd31..c2b1764fdb 100644 --- a/src/library/scala/Option.scala +++ b/src/library/scala/Option.scala @@ -21,7 +21,7 @@ object Option { */ def apply[A](x: A): Option[A] = if (x == null) None else Some(x) - /** An Option factory which returns $none in a manner consistent with + /** An Option factory which returns `None` in a manner consistent with * the collections hierarchy. */ def empty[A] : Option[A] = None diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index 61c8ca3f6a..20473009bf 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -12,7 +12,7 @@ import scala.collection.{ mutable, immutable, generic } import immutable.StringOps import mutable.ArrayOps import generic.CanBuildFrom -import annotation.elidable +import annotation.{ elidable, implicitNotFound } import annotation.elidable.ASSERTION /** The <code>Predef</code> object provides definitions that are @@ -342,6 +342,7 @@ object Predef extends LowPriorityImplicits { * where L is the required lower bound). * in part contributed by Jason Zaugg */ + @implicitNotFound(msg = "Cannot prove that ${From} <:< ${To}.") sealed abstract class <:<[-From, +To] extends (From => To) with Serializable implicit def conforms[A]: A <:< A = new (A <:< A) { def apply(x: A) = x } // not in the <:< companion object because it is also intended to subsume identity (which is no longer implicit) @@ -350,6 +351,7 @@ object Predef extends LowPriorityImplicits { * * @see <:< for expressing subtyping constraints */ + @implicitNotFound(msg = "Cannot prove that ${From} =:= ${To}.") sealed abstract class =:=[From, To] extends (From => To) with Serializable object =:= { implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x} diff --git a/src/library/scala/Product.scala b/src/library/scala/Product.scala index 786be5ec13..dfa04bbbe7 100644 --- a/src/library/scala/Product.scala +++ b/src/library/scala/Product.scala @@ -8,30 +8,33 @@ package scala -/** Base trait for all products. See [[scala.Product2]]. +/** Base trait for all products, which in the standard library include at least + * [[scala.Product1]] through [[scala.Product22]] and therefore also their + * subclasses [[scala.Tuple1]] through [[scala.Tuple22]]. In addition, all case + * classes implement Product with synthetically generated methods. * * @author Burak Emir * @version 1.0 * @since 2.3 */ trait Product extends Equals { - - /** Returns the nth element of this product, 0-based. In other words, for a - * product <code>A(x_1,...,x_k)</code>, returns <code>x_(n+1)</code> - * where <code>0 <= n < k</code> + /** The nth element of this product, 0-based. In other words, for a + * product `A(x_1, ..., x_k)`, returns x_(n+1) where 0 < n < k. * - * @param n the index of the element to return - * @throws IndexOutOfBoundsException - * @return The element <code>n</code> elements after the first element + * @param n the index of the element to return + * @throws IndexOutOfBoundsException + * @return the element `n` elements after the first element */ def productElement(n: Int): Any - /** Returns the size of this product. - * @return For a product <code>A(x_1,...,x_k)</code>, returns `k` + /** The size of this product. + * @return for a product `A(x_1, ..., x_k)`, returns `k` */ def productArity: Int - /** An iterator that returns all fields of this product */ + /** An iterator over all the elements of this product. + * @return in the default implementation, an Iterator[Any] + */ def productIterator: Iterator[Any] = new Iterator[Any] { private var c: Int = 0 private val cmax = productArity @@ -42,12 +45,11 @@ trait Product extends Equals { @deprecated("use productIterator instead") def productElements: Iterator[Any] = productIterator - /** - * Returns a string that is used in the `toString` method of subtraits/classes. - * Implementations may override this - * method in order to prepend a string prefix to the result of the - * toString methods. - * @return the empty string + /** A string used in the `toString` methods of derived classes. + * Implementations may override this method to prepend a string prefix + * to the result of toString methods. + * + * @return in the default implementation, the empty string */ def productPrefix = "" } diff --git a/src/library/scala/Short.scala b/src/library/scala/Short.scala index df3e680575..8bf6f09154 100644 --- a/src/library/scala/Short.scala +++ b/src/library/scala/Short.scala @@ -10,9 +10,12 @@ package scala -import java.{ lang => jl } - - +/** `Short` is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. + * + * There is an implicit conversion from [[scala.Short]] => [[scala.runtime.RichShort]] + * which provides useful non-primitive operations. + */ final class Short extends AnyVal { def toByte: Byte = sys.error("stub") def toShort: Short = sys.error("stub") @@ -143,12 +146,34 @@ final class Short extends AnyVal { } - object Short extends AnyValCompanion { - final val MinValue = jl.Short.MIN_VALUE - final val MaxValue = jl.Short.MAX_VALUE - - def box(x: Short): jl.Short = jl.Short.valueOf(x) - def unbox(x: jl.Object): Short = x.asInstanceOf[jl.Short].shortValue() + /** The smallest value representable as a Short. + */ + final val MinValue = java.lang.Short.MIN_VALUE + + /** The largest value representable as a Short. + */ + final val MaxValue = java.lang.Short.MAX_VALUE + + /** Transform a value type into a boxed reference type. + * + * @param x the Short to be boxed + * @return a java.lang.Short offering `x` as its underlying value. + */ + def box(x: Short): java.lang.Short = java.lang.Short.valueOf(x) + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a java.lang.Short. + * + * @param x the java.lang.Short to be unboxed. + * @throws ClassCastException if the argument is not a java.lang.Short + * @return the Short resulting from calling shortValue() on `x` + */ + def unbox(x: java.lang.Object): Short = x.asInstanceOf[java.lang.Short].shortValue() + + /** The String representation of the scala.Short companion object. + */ override def toString = "object scala.Short" } + diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala index fc9b348fdb..afac96fe97 100644 --- a/src/library/scala/Tuple2.scala +++ b/src/library/scala/Tuple2.scala @@ -49,7 +49,7 @@ case class Tuple2[@specialized(Int, Long, Double) +T1, @specialized(Int, Long, D * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] = new Zipped[Repr1, El1, Repr2, El2](_1, _2) diff --git a/src/library/scala/Tuple3.scala b/src/library/scala/Tuple3.scala index 2f533b10b2..6458fa5042 100644 --- a/src/library/scala/Tuple3.scala +++ b/src/library/scala/Tuple3.scala @@ -46,7 +46,7 @@ case class Tuple3[+T1, +T2, +T3](_1: T1, _2: T2, _3: T3) * }}} * * @see Zipped - * $willNotTerminateInf + * Note: will not terminate for infinite-sized collections. */ def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2], diff --git a/src/library/scala/Unit.scala b/src/library/scala/Unit.scala index 9e2d4dc616..58b024273b 100755 --- a/src/library/scala/Unit.scala +++ b/src/library/scala/Unit.scala @@ -10,14 +10,35 @@ package scala -import java.{ lang => jl } - -import runtime.BoxedUnit +/** Unit is a member of the value classes, those whose instances are + * not represented as objects by the underlying host system. There is + * only one value of type Unit: `()`. + */ final class Unit extends AnyVal { } + object Unit extends AnyValCompanion { + + /** Transform a value type into a boxed reference type. + * + * @param x the Unit to be boxed + * @return a scala.runtime.BoxedUnit offering `x` as its underlying value. + */ + def box(x: Unit): scala.runtime.BoxedUnit = scala.runtime.BoxedUnit.UNIT + + /** Transform a boxed type into a value type. Note that this + * method is not typesafe: it accepts any Object, but will throw + * an exception if the argument is not a scala.runtime.BoxedUnit. + * + * @param x the scala.runtime.BoxedUnit to be unboxed. + * @throws ClassCastException if the argument is not a scala.runtime.BoxedUnit + * @return the Unit value () + */ + def unbox(x: java.lang.Object): Unit = () + + /** The String representation of the scala.Unit companion object. + */ override def toString = "object scala.Unit" - def box(x: Unit): BoxedUnit = BoxedUnit.UNIT - def unbox(x: jl.Object): Unit = () -}
\ No newline at end of file +} + diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index 81582b7f78..4e349cb423 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -12,7 +12,6 @@ package scala.collection import mutable.ArrayBuffer import annotation.{ tailrec, migration } -import parallel.ParIterable /** The `Iterator` object provides various functions for * creating specialized iterators. diff --git a/src/library/scala/collection/Map.scala b/src/library/scala/collection/Map.scala index 075317a483..7dcaafe45d 100644 --- a/src/library/scala/collection/Map.scala +++ b/src/library/scala/collection/Map.scala @@ -13,7 +13,7 @@ import generic._ /** * A map from keys of type `A` to values of type `B`. * - * $mapnote + * $mapNote * * '''Note:''' If you do not have specific implementations for `add` and `-` in mind, * you might consider inheriting from `DefaultMap` instead. diff --git a/src/library/scala/collection/Parallel.scala b/src/library/scala/collection/Parallel.scala index df77e5d1c7..037abde2b6 100644 --- a/src/library/scala/collection/Parallel.scala +++ b/src/library/scala/collection/Parallel.scala @@ -6,21 +6,11 @@ ** |/ ** \* */ - package scala.collection - - - - - /** A marker trait for objects with parallelised operations. * * @since 2.9 * @author prokopec */ trait Parallel - - - - diff --git a/src/library/scala/collection/SetProxyLike.scala b/src/library/scala/collection/SetProxyLike.scala index eaf67323b7..9308de45b0 100644 --- a/src/library/scala/collection/SetProxyLike.scala +++ b/src/library/scala/collection/SetProxyLike.scala @@ -19,10 +19,8 @@ import generic._ * @author Martin Odersky * @version 2.8 */ -trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This] -{ +trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This] { def empty: This - // def empty: This override def contains(elem: A): Boolean = self.contains(elem) override def + (elem: A) = self.+(elem) override def - (elem: A) = self.-(elem) diff --git a/src/library/scala/collection/SortedSet.scala b/src/library/scala/collection/SortedSet.scala index 46629b0cec..a1d1cd3fc3 100644 --- a/src/library/scala/collection/SortedSet.scala +++ b/src/library/scala/collection/SortedSet.scala @@ -29,6 +29,3 @@ object SortedSet extends SortedSetFactory[SortedSet] { def empty[A](implicit ord: Ordering[A]): immutable.SortedSet[A] = immutable.SortedSet.empty[A](ord) implicit def canBuildFrom[A](implicit ord: Ordering[A]): CanBuildFrom[Coll, A, SortedSet[A]] = new SortedSetCanBuildFrom[A] } - - - diff --git a/src/library/scala/collection/TraversableOnce.scala b/src/library/scala/collection/TraversableOnce.scala index 0a2d851b2d..f660d31ab2 100644 --- a/src/library/scala/collection/TraversableOnce.scala +++ b/src/library/scala/collection/TraversableOnce.scala @@ -37,11 +37,17 @@ import annotation.unchecked.{ uncheckedVariance => uV } * @since 2.8 * * @define coll traversable or iterator + * @define orderDependent + * + * Note: might return different results for different runs, unless the underlying collection type is ordered. * @define orderDependentFold * * Note: might return different results for different runs, unless the * underlying collection type is ordered or the operator is associative * and commutative. + * @define mayNotTerminateInf + * + * Note: may not terminate for infinite-sized collections. * @define willNotTerminateInf * * Note: will not terminate for infinite-sized collections. @@ -393,7 +399,7 @@ trait TraversableOnce[+A] { } def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A = { if (isEmpty) - throw new UnsupportedOperationException("empty.maxBy") + throw new UnsupportedOperationException("empty.minBy") reduceLeft((x, y) => if (cmp.lteq(f(x), f(y))) x else y) } diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala index 6f7f7f5a28..b5b18b7a8a 100644 --- a/src/library/scala/collection/TraversableViewLike.scala +++ b/src/library/scala/collection/TraversableViewLike.scala @@ -30,7 +30,7 @@ trait ViewMkString[+A] { } /** A template trait for non-strict views of traversable collections. - * $traversableviewinfo + * $traversableViewInfo * * Implementation note: Methods such as `map` or `flatMap` on this view will not invoke the implicitly passed * `Builder` factory, but will return a new view directly, to preserve by-name behavior. @@ -38,14 +38,14 @@ trait ViewMkString[+A] { * that takes a `View` as its `From` type parameter must yield the same view (or a generic * superclass of it) as its result parameter. If that assumption is broken, cast errors might result. * - * @define viewinfo + * @define viewInfo * A view is a lazy version of some collection. Collection transformers such as * `map` or `filter` or `++` do not traverse any elements when applied on a view. * Instead they create a new view which simply records that fact that the operation * needs to be applied. The collection elements are accessed, and the view operations are applied, * when a non-view result is needed, or when the `force` method is called on a view. - * @define traversableviewinfo - * $viewinfo + * @define traversableViewInfo + * $viewInfo * * All views for traversable collections are defined by creating a new `foreach` method. diff --git a/src/library/scala/collection/generic/Addable.scala b/src/library/scala/collection/generic/Addable.scala index d80e85c039..5be428305e 100644 --- a/src/library/scala/collection/generic/Addable.scala +++ b/src/library/scala/collection/generic/Addable.scala @@ -16,10 +16,10 @@ package generic * @tparam A the type of the elements of the $coll * @tparam Repr the type of the $coll itself * @author Martin Odersky - * @version 2.8 - * @since 2.8 - * @define $coll collection - * @define $Coll Addable + * @version 2.8 + * @since 2.8 + * @define coll collection + * @define Coll Addable */ @deprecated("Will be removed after scala 2.9") trait Addable[A, +Repr <: Addable[A, Repr]] { self => diff --git a/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala b/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala index 69ae465806..82270d5728 100644 --- a/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala +++ b/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala @@ -6,20 +6,14 @@ ** |/ ** \* */ - package scala.collection package generic - - - - abstract class ClassManifestTraversableFactory[CC[X] <: Traversable[X] with GenericClassManifestTraversableTemplate[X, CC]] -extends GenericClassManifestCompanion[CC] { + extends GenericClassManifestCompanion[CC] { class GenericCanBuildFrom[A](implicit manif: ClassManifest[A]) extends CanBuildFrom[CC[_], A, CC[A]] { def apply(from: CC[_]) = from.genericClassManifestBuilder[A] def apply = newBuilder[A] } - } diff --git a/src/library/scala/collection/generic/GenericClassManifestCompanion.scala b/src/library/scala/collection/generic/GenericClassManifestCompanion.scala index b85fc93cba..546e82fb4a 100644 --- a/src/library/scala/collection/generic/GenericClassManifestCompanion.scala +++ b/src/library/scala/collection/generic/GenericClassManifestCompanion.scala @@ -6,17 +6,12 @@ ** |/ ** \* */ - - package scala.collection package generic import mutable.Builder - - - -/** This class represents companions of classes which require classmanifests +/** This class represents companions of classes which require ClassManifests * for their element types. * * @author Aleksandar Prokopec @@ -34,4 +29,3 @@ abstract class GenericClassManifestCompanion[+CC[X] <: Traversable[X]] { b.result } } - diff --git a/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala b/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala index 80415f8e79..03d426946b 100644 --- a/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala +++ b/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala @@ -6,17 +6,12 @@ ** |/ ** \* */ - - package scala.collection package generic import mutable.Builder import annotation.unchecked.uncheckedVariance - - - /** This trait represents collections classes which require class * manifests for their element types. * @@ -27,4 +22,3 @@ trait GenericClassManifestTraversableTemplate[+A, +CC[X] <: Traversable[X]] exte def classManifestCompanion: GenericClassManifestCompanion[CC] def genericClassManifestBuilder[B](implicit man: ClassManifest[B]): Builder[B, CC[B]] = classManifestCompanion.newBuilder[B] } - diff --git a/src/library/scala/collection/generic/GenericCompanion.scala b/src/library/scala/collection/generic/GenericCompanion.scala index 5aa9656cf2..084f884ebb 100644 --- a/src/library/scala/collection/generic/GenericCompanion.scala +++ b/src/library/scala/collection/generic/GenericCompanion.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.collection package generic diff --git a/src/library/scala/collection/generic/GenericParCompanion.scala b/src/library/scala/collection/generic/GenericParCompanion.scala index 0da1a3a543..9e151e7543 100644 --- a/src/library/scala/collection/generic/GenericParCompanion.scala +++ b/src/library/scala/collection/generic/GenericParCompanion.scala @@ -1,14 +1,13 @@ package scala.collection.generic - import scala.collection.parallel.Combiner import scala.collection.parallel.ParIterable import scala.collection.parallel.ParMap - - /** A template class for companion objects of parallel collection classes. * They should be mixed in together with `GenericCompanion` type. + * + * @define Coll ParIterable * @tparam CC the type constructor representing the collection class * @since 2.8 */ diff --git a/src/library/scala/collection/generic/ParFactory.scala b/src/library/scala/collection/generic/ParFactory.scala index a7ebb8c912..b4da60a133 100644 --- a/src/library/scala/collection/generic/ParFactory.scala +++ b/src/library/scala/collection/generic/ParFactory.scala @@ -9,8 +9,8 @@ import scala.collection.parallel.Combiner /** A template class for companion objects of `ParIterable` and subclasses thereof. * This class extends `TraversableFactory` and provides a set of operations to create `$Coll` objects. * - * @define $coll parallel collection - * @define $Coll ParIterable + * @define coll parallel collection + * @define Coll ParIterable */ abstract class ParFactory[CC[X] <: ParIterable[X] with GenericParTemplate[X, CC]] extends TraversableFactory[CC] diff --git a/src/library/scala/collection/generic/ParMapFactory.scala b/src/library/scala/collection/generic/ParMapFactory.scala index 2fba05c743..dda49e1354 100644 --- a/src/library/scala/collection/generic/ParMapFactory.scala +++ b/src/library/scala/collection/generic/ParMapFactory.scala @@ -1,20 +1,15 @@ package scala.collection.generic - - import scala.collection.parallel.ParMap import scala.collection.parallel.ParMapLike import scala.collection.parallel.Combiner import scala.collection.mutable.Builder - - - /** A template class for companion objects of `ParMap` and subclasses thereof. * This class extends `TraversableFactory` and provides a set of operations to create `$Coll` objects. * - * @define $coll parallel map - * @define $Coll ParMap + * @define coll parallel map + * @define Coll ParMap */ abstract class ParMapFactory[CC[X, Y] <: ParMap[X, Y] with ParMapLike[X, Y, CC[X, Y], _]] extends MapFactory[CC] diff --git a/src/library/scala/collection/generic/Subtractable.scala b/src/library/scala/collection/generic/Subtractable.scala index 158a3cac60..1b3425d792 100644 --- a/src/library/scala/collection/generic/Subtractable.scala +++ b/src/library/scala/collection/generic/Subtractable.scala @@ -16,10 +16,10 @@ package generic * @tparam A the type of the elements of the $coll. * @tparam Repr the type of the $coll itself * @author Martin Odersky - * @version 2.8 - * @since 2.8 - * @define $coll collection - * @define $Coll Subtractable + * @version 2.8 + * @since 2.8 + * @define coll collection + * @define Coll Subtractable */ trait Subtractable[A, +Repr <: Subtractable[A, Repr]] { self => diff --git a/src/library/scala/collection/immutable/IntMap.scala b/src/library/scala/collection/immutable/IntMap.scala index 140ba4dbec..ea68b53518 100644 --- a/src/library/scala/collection/immutable/IntMap.scala +++ b/src/library/scala/collection/immutable/IntMap.scala @@ -35,6 +35,11 @@ private[immutable] object IntMapUtils extends BitOperations.Int { import IntMapUtils._ /** A companion object for integer maps. + * + * @define Coll IntMap + * @define mapCanBuildFromInfo + * The standard `CanBuildFrom` instance for `$Coll` objects. + * The created value is an instance of class `MapCanBuildFrom`. * @since 2.7 */ object IntMap { diff --git a/src/library/scala/collection/immutable/List.scala b/src/library/scala/collection/immutable/List.scala index c46c487968..84b62e7e29 100644 --- a/src/library/scala/collection/immutable/List.scala +++ b/src/library/scala/collection/immutable/List.scala @@ -33,7 +33,7 @@ import annotation.tailrec * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `List[B]` because an implicit of type `CanBuildFrom[List, B, That]` * is defined in object `List`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `List`. diff --git a/src/library/scala/collection/immutable/LongMap.scala b/src/library/scala/collection/immutable/LongMap.scala index d5f1374540..030dd72d35 100644 --- a/src/library/scala/collection/immutable/LongMap.scala +++ b/src/library/scala/collection/immutable/LongMap.scala @@ -35,9 +35,14 @@ private[immutable] object LongMapUtils extends BitOperations.Long { import LongMapUtils._ /** A companion object for long maps. + * + * @define Coll LongMap + * @define mapCanBuildFromInfo + * The standard `CanBuildFrom` instance for `$Coll` objects. + * The created value is an instance of class `MapCanBuildFrom`. * @since 2.7 */ -object LongMap{ +object LongMap { /** $mapCanBuildFromInfo */ implicit def canBuildFrom[A, B] = new CanBuildFrom[LongMap[A], (Long, B), LongMap[B]] { def apply(from: LongMap[A]): Builder[(Long, B), LongMap[B]] = apply() @@ -69,7 +74,6 @@ object LongMap{ else LongMap.Bin[S](prefix, mask, left, right); } } - } import LongMap._ diff --git a/src/library/scala/collection/immutable/Set.scala b/src/library/scala/collection/immutable/Set.scala index 7975134174..33bc50ab56 100644 --- a/src/library/scala/collection/immutable/Set.scala +++ b/src/library/scala/collection/immutable/Set.scala @@ -15,13 +15,12 @@ import generic._ import parallel.immutable.ParSet /** A generic trait for immutable sets. + * $setNote + * $setTags * - * $setnote - * + * @since 1.0 * @author Matthias Zenger * @author Martin Odersky - * @version 2.8 - * @since 1 * @define Coll immutable.Set * @define coll immutable set */ diff --git a/src/library/scala/collection/immutable/StringLike.scala b/src/library/scala/collection/immutable/StringLike.scala index 926fde4fe0..98f1b90866 100644 --- a/src/library/scala/collection/immutable/StringLike.scala +++ b/src/library/scala/collection/immutable/StringLike.scala @@ -162,6 +162,21 @@ self => if (toString.endsWith(suffix)) toString.substring(0, toString.length() - suffix.length) else toString + /** Replace all literal occurrences of `literal` with the string `replacement`. + * This is equivalent to [[java.lang.String#replaceAll]] except that both arguments + * are appropriately quoted to avoid being interpreted as metacharacters. + * + * @param literal the string which should be replaced everywhere it occurs + * @param replacement the replacement string + * @return the resulting string + */ + def replaceAllLiterally(literal: String, replacement: String): String = { + val arg1 = java.util.regex.Pattern.quote(literal) + val arg2 = java.util.regex.Matcher.quoteReplacement(replacement) + + toString.replaceAll(arg1, arg2) + } + /** * For every line in this string: * diff --git a/src/library/scala/collection/mutable/ArrayBuffer.scala b/src/library/scala/collection/mutable/ArrayBuffer.scala index daa3c48578..7edbad6518 100644 --- a/src/library/scala/collection/mutable/ArrayBuffer.scala +++ b/src/library/scala/collection/mutable/ArrayBuffer.scala @@ -31,7 +31,7 @@ import parallel.mutable.ParArray * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `ArrayBuffer[B]` because an implicit of type `CanBuildFrom[ArrayBuffer, B, ArrayBuffer[B]]` * is defined in object `ArrayBuffer`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ArrayBuffer`. diff --git a/src/library/scala/collection/mutable/ArraySeq.scala b/src/library/scala/collection/mutable/ArraySeq.scala index 0b3f0ebc5b..b6cafbb677 100644 --- a/src/library/scala/collection/mutable/ArraySeq.scala +++ b/src/library/scala/collection/mutable/ArraySeq.scala @@ -30,7 +30,7 @@ import parallel.mutable.ParArray * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `ArraySeq[B]` because an implicit of type `CanBuildFrom[ArraySeq, B, ArraySeq[B]]` * is defined in object `ArraySeq`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ArraySeq`. diff --git a/src/library/scala/collection/mutable/BitSet.scala b/src/library/scala/collection/mutable/BitSet.scala index 4735d58e33..a547e8a17e 100644 --- a/src/library/scala/collection/mutable/BitSet.scala +++ b/src/library/scala/collection/mutable/BitSet.scala @@ -23,7 +23,7 @@ import BitSetLike.{LogWL, updateArray} * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `BitSet[B]` because an implicit of type `CanBuildFrom[BitSet, B, BitSet]` * is defined in object `BitSet`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `BitSet`. diff --git a/src/library/scala/collection/mutable/DoubleLinkedList.scala b/src/library/scala/collection/mutable/DoubleLinkedList.scala index f2a732ffd1..2d630c3756 100644 --- a/src/library/scala/collection/mutable/DoubleLinkedList.scala +++ b/src/library/scala/collection/mutable/DoubleLinkedList.scala @@ -28,7 +28,7 @@ import generic._ * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `DoubleLinkedList[B]` because an implicit of type `CanBuildFrom[DoubleLinkedList, B, DoubleLinkedList[B]]` * is defined in object `DoubleLinkedList`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `DoubleLinkedList`. @@ -66,26 +66,24 @@ class DoubleLinkedList[A]() extends LinearSeq[A] * @define Coll DoubleLinkedList */ object DoubleLinkedList extends SeqFactory[DoubleLinkedList] { - /** $genericCanBuildFrom */ + /** $genericCanBuildFromInfo */ implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, DoubleLinkedList[A]] = new GenericCanBuildFrom[A] + def newBuilder[A]: Builder[A, DoubleLinkedList[A]] = new Builder[A, DoubleLinkedList[A]] { - var current: DoubleLinkedList[A] = _ - val emptyList = new DoubleLinkedList[A]() - if(null == current) - current = emptyList + def emptyList() = new DoubleLinkedList[A]() + var current = emptyList() def +=(elem: A): this.type = { - if (current.nonEmpty) - current.insert(new DoubleLinkedList(elem, emptyList)) + if (current.isEmpty) + current = new DoubleLinkedList(elem, emptyList()) else - current = new DoubleLinkedList(elem, emptyList) + current append new DoubleLinkedList(elem, emptyList()) + this } - def clear() { - current = emptyList - } + def clear(): Unit = current = emptyList() def result() = current } } diff --git a/src/library/scala/collection/mutable/DoubleLinkedListLike.scala b/src/library/scala/collection/mutable/DoubleLinkedListLike.scala index 18a0e164a2..7ad2f9558f 100644 --- a/src/library/scala/collection/mutable/DoubleLinkedListLike.scala +++ b/src/library/scala/collection/mutable/DoubleLinkedListLike.scala @@ -110,12 +110,9 @@ trait DoubleLinkedListLike[A, This <: Seq[A] with DoubleLinkedListLike[A, This]] private def outofbounds(n: Int) = throw new IndexOutOfBoundsException(n.toString) - override def drop(n: Int): This = super[SeqLike].drop(n) - - override def tail = drop(1) - - override def apply(n: Int): A = atLocation(n)(_.elem)(outofbounds(n)) - override def update(n: Int, x: A): Unit = atLocation(n)(_.elem = x)(outofbounds(n)) - override def get(n: Int): Option[A] = atLocation[Option[A]](n)(x => Some(x.elem))(None) - + override def drop(n: Int): This = super[SeqLike].drop(n) + override def tail = drop(1) + override def apply(n: Int): A = atLocation(n)(_.elem)(outofbounds(n)) + override def update(n: Int, x: A): Unit = atLocation(n)(_.elem = x)(outofbounds(n)) + override def get(n: Int): Option[A] = atLocation[Option[A]](n)(x => Some(x.elem))(None) } diff --git a/src/library/scala/collection/mutable/FlatHashTable.scala b/src/library/scala/collection/mutable/FlatHashTable.scala index 48386c8034..d78c466f69 100644 --- a/src/library/scala/collection/mutable/FlatHashTable.scala +++ b/src/library/scala/collection/mutable/FlatHashTable.scala @@ -16,13 +16,10 @@ package mutable * This trait is used internally. It can be mixed in with various collections relying on * hash table as an implementation. * - * @coll flat hash table - * + * @define coll flat hash table * @define cannotStoreNull '''Note''': A $coll cannot store `null` elements. - * * @since 2.3 - * - * @tparam A the type of the elements contained in the flat hash table. + * @tparam A the type of the elements contained in the $coll. */ trait FlatHashTable[A] extends FlatHashTable.HashUtils[A] { import FlatHashTable._ diff --git a/src/library/scala/collection/mutable/HashMap.scala b/src/library/scala/collection/mutable/HashMap.scala index e78e9a1296..19ad53faf5 100644 --- a/src/library/scala/collection/mutable/HashMap.scala +++ b/src/library/scala/collection/mutable/HashMap.scala @@ -32,7 +32,7 @@ import scala.collection.parallel.mutable.ParHashMap * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[HashMap, (A, B), HashMap[A, B]]` * is defined in object `HashMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `HashMap`. diff --git a/src/library/scala/collection/mutable/HashSet.scala b/src/library/scala/collection/mutable/HashSet.scala index 2ba5065964..134558ad15 100644 --- a/src/library/scala/collection/mutable/HashSet.scala +++ b/src/library/scala/collection/mutable/HashSet.scala @@ -23,15 +23,12 @@ import collection.parallel.mutable.ParHashSet * @version 2.0, 31/12/2006 * @since 1 * - * @tparam A the type of the elements contained in this set. - * - * * @define Coll mutable.HashSet * @define coll mutable hash set * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `HashSet[B]` because an implicit of type `CanBuildFrom[HashSet, B, HashSet[B]]` * is defined in object `HashSet`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `HashSet`. diff --git a/src/library/scala/collection/mutable/IndexedSeqView.scala b/src/library/scala/collection/mutable/IndexedSeqView.scala index 12b0229ae1..6af00d03b1 100644 --- a/src/library/scala/collection/mutable/IndexedSeqView.scala +++ b/src/library/scala/collection/mutable/IndexedSeqView.scala @@ -16,7 +16,7 @@ import generic._ import TraversableView.NoBuilder /** A non-strict view of a mutable `IndexedSeq`. - * $viewinfo + * $viewInfo * Some of the operations of this class will yield again a mutable indexed sequence, * others will just yield a plain indexed sequence of type `collection.IndexedSeq`. * Because this is a leaf class there is no associated `Like' class. diff --git a/src/library/scala/collection/mutable/LinkedHashMap.scala b/src/library/scala/collection/mutable/LinkedHashMap.scala index 6df68b6e6e..31f539cc09 100644 --- a/src/library/scala/collection/mutable/LinkedHashMap.scala +++ b/src/library/scala/collection/mutable/LinkedHashMap.scala @@ -35,7 +35,7 @@ object LinkedHashMap extends MutableMapFactory[LinkedHashMap] { * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[LinkedHashMap, (A, B), LinkedHashMap[A, B]]` * is defined in object `LinkedHashMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `LinkedHashMap`. diff --git a/src/library/scala/collection/mutable/LinkedHashSet.scala b/src/library/scala/collection/mutable/LinkedHashSet.scala index bdbd22286a..7a1e695f32 100644 --- a/src/library/scala/collection/mutable/LinkedHashSet.scala +++ b/src/library/scala/collection/mutable/LinkedHashSet.scala @@ -29,7 +29,7 @@ import generic._ * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `LinkedHashSet[B]` because an implicit of type `CanBuildFrom[LinkedHashSet, B, LinkedHashSet[B]]` * is defined in object `LinkedHashSet`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `LinkedHashSet`. diff --git a/src/library/scala/collection/mutable/LinkedList.scala b/src/library/scala/collection/mutable/LinkedList.scala index beee4857b0..b701a42596 100644 --- a/src/library/scala/collection/mutable/LinkedList.scala +++ b/src/library/scala/collection/mutable/LinkedList.scala @@ -28,7 +28,7 @@ import generic._ * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `LinkedList[B]` because an implicit of type `CanBuildFrom[LinkedList, B, LinkedList[B]]` * is defined in object `LinkedList`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `LinkedList`. @@ -60,10 +60,9 @@ class LinkedList[A]() extends LinearSeq[A] * @define coll linked list */ object LinkedList extends SeqFactory[LinkedList] { - override def empty[A]: LinkedList[A] = new LinkedList[A] - implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, LinkedList[A]] = new GenericCanBuildFrom[A] + def newBuilder[A]: Builder[A, LinkedList[A]] = (new MutableList) mapResult ((l: MutableList[A]) => l.toLinkedList) } diff --git a/src/library/scala/collection/mutable/LinkedListLike.scala b/src/library/scala/collection/mutable/LinkedListLike.scala index b24cda946e..a3fd786c2a 100644 --- a/src/library/scala/collection/mutable/LinkedListLike.scala +++ b/src/library/scala/collection/mutable/LinkedListLike.scala @@ -60,12 +60,14 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq var next: This = _ override def isEmpty = next eq this - override def length: Int = length0(repr, 0) - @tailrec private def length0(elem: This, acc: Int): Int = if (elem.isEmpty) acc else length0(elem.next, acc + 1) + @tailrec private def length0(elem: This, acc: Int): Int = + if (elem.isEmpty) acc else length0(elem.next, acc + 1) - override def head: A = elem + override def head: A = + if (isEmpty) throw new NoSuchElementException + else elem override def tail: This = { require(nonEmpty, "tail of empty list") @@ -92,7 +94,8 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq def insert(that: This): Unit = { require(nonEmpty, "insert into empty list") if (that.nonEmpty) { - next = next.append(that) + that append next + next = that } } @@ -100,7 +103,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq var i = 0 var these: This = repr while (i < n && !these.isEmpty) { - these = these.next.asInstanceOf[This] // !!! concrete overrides abstract problem + these = these.next i += 1 } these @@ -108,7 +111,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq private def atLocation[T](n: Int)(f: This => T) = { val loc = drop(n) - if (!loc.isEmpty) f(loc) + if (loc.nonEmpty) f(loc) else throw new IndexOutOfBoundsException(n.toString) } diff --git a/src/library/scala/collection/mutable/ListBuffer.scala b/src/library/scala/collection/mutable/ListBuffer.scala index 67d34cb481..6a75108dfb 100644 --- a/src/library/scala/collection/mutable/ListBuffer.scala +++ b/src/library/scala/collection/mutable/ListBuffer.scala @@ -29,7 +29,7 @@ import immutable.{List, Nil, ::} * @define thatinfo the class of the returned collection. In the standard library configuration, * `That` is always `ListBuffer[B]` because an implicit of type `CanBuildFrom[ListBuffer, B, ListBuffer[B]]` * is defined in object `ListBuffer`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ListBuffer`. diff --git a/src/library/scala/collection/mutable/ListMap.scala b/src/library/scala/collection/mutable/ListMap.scala index 37baea60c2..c02593fdf3 100644 --- a/src/library/scala/collection/mutable/ListMap.scala +++ b/src/library/scala/collection/mutable/ListMap.scala @@ -25,7 +25,7 @@ import generic._ * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[ListMap, (A, B), ListMap[A, B]]` * is defined in object `ListMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `ListMap`. diff --git a/src/library/scala/collection/mutable/MutableList.scala b/src/library/scala/collection/mutable/MutableList.scala index 0595faff67..86b0da39f1 100644 --- a/src/library/scala/collection/mutable/MutableList.scala +++ b/src/library/scala/collection/mutable/MutableList.scala @@ -17,8 +17,7 @@ import immutable.{List, Nil} // !!! todo: convert to LinkedListBuffer? /** * This class is used internally to represent mutable lists. It is the - * basis for the implementation of the classes - * `Stack`, and `Queue`. + * basis for the implementation of the class `Queue`. * * @author Matthias Zenger * @author Martin Odersky diff --git a/src/library/scala/collection/mutable/Set.scala b/src/library/scala/collection/mutable/Set.scala index 8d0588e5b9..dba629ae67 100644 --- a/src/library/scala/collection/mutable/Set.scala +++ b/src/library/scala/collection/mutable/Set.scala @@ -13,11 +13,14 @@ package mutable import generic._ -/** A base trait for sets that can be mutated. +/** A generic trait for mutable sets. * $setNote * $setTags + * * @since 1.0 * @author Matthias Zenger + * @define Coll mutable.Set + * @define coll mutable set */ trait Set[A] extends Iterable[A] with scala.collection.Set[A] diff --git a/src/library/scala/collection/mutable/StringBuilder.scala b/src/library/scala/collection/mutable/StringBuilder.scala index 0d1c51c42f..925a9fd9da 100644 --- a/src/library/scala/collection/mutable/StringBuilder.scala +++ b/src/library/scala/collection/mutable/StringBuilder.scala @@ -445,10 +445,9 @@ final class StringBuilder(private val underlying: JavaStringBuilder) */ override def mkString = toString - /** Returns the result of this Builder, which in the case - * of StringBuilders is a StringBuilder (not a String.) + /** Returns the result of this Builder (a String) * - * @return this StringBuilder + * @return the string assembled by this StringBuilder */ def result(): String = toString } diff --git a/src/library/scala/collection/mutable/UnrolledBuffer.scala b/src/library/scala/collection/mutable/UnrolledBuffer.scala index 10a572408b..0933aeaf69 100644 --- a/src/library/scala/collection/mutable/UnrolledBuffer.scala +++ b/src/library/scala/collection/mutable/UnrolledBuffer.scala @@ -1,15 +1,8 @@ package scala.collection.mutable - - import collection.generic._ - import annotation.tailrec - - - - /** A buffer that stores elements in an unrolled linked list. * * Unrolled linked lists store elements in linked fixed size @@ -32,10 +25,10 @@ import annotation.tailrec * Better than singly linked lists for random access, but * should still be avoided for such a purpose. * + * @define coll unrolled buffer + * @define Coll UnrolledBuffer * @author Aleksandar Prokopec * - * @coll unrolled buffer - * @Coll UnrolledBuffer */ @SerialVersionUID(1L) class UnrolledBuffer[T](implicit val manifest: ClassManifest[T]) diff --git a/src/library/scala/collection/mutable/WeakHashMap.scala b/src/library/scala/collection/mutable/WeakHashMap.scala index 3e6366dbd0..be2daa05ce 100644 --- a/src/library/scala/collection/mutable/WeakHashMap.scala +++ b/src/library/scala/collection/mutable/WeakHashMap.scala @@ -30,7 +30,7 @@ import generic._ * pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[WeakHashMap, (A, B), WeakHashMap[A, B]]` * is defined in object `WeakHashMap`. Otherwise, `That` resolves to the most specific type that doesn't have * to contain pairs of type `(A, B)`, which is `Iterable`. - * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the + * @define bfinfo an implicit value of class `CanBuildFrom` which determines the * result class `That` from the current representation type `Repr` * and the new element type `B`. This is usually the `canBuildFrom` value * defined in object `WeakHashMap`. diff --git a/src/library/scala/collection/parallel/ParIterable.scala b/src/library/scala/collection/parallel/ParIterable.scala index 48b0e35151..aeed6949c7 100644 --- a/src/library/scala/collection/parallel/ParIterable.scala +++ b/src/library/scala/collection/parallel/ParIterable.scala @@ -6,15 +6,12 @@ ** |/ ** \* */ - package scala.collection.parallel - import scala.collection.generic._ import scala.collection.parallel.mutable.ParArrayCombiner import scala.collection.parallel.mutable.ParArray - /** A template trait for parallel iterable collections. * * $paralleliterableinfo @@ -35,7 +32,7 @@ trait ParIterable[+T] extends Iterable[T] override def companion: GenericCompanion[ParIterable] with GenericParCompanion[ParIterable] = ParIterable } -/** $factoryinfo +/** $factoryInfo */ object ParIterable extends ParFactory[ParIterable] { implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = new GenericCanCombineFrom[T] @@ -44,17 +41,3 @@ object ParIterable extends ParFactory[ParIterable] { def newCombiner[T]: Combiner[T, ParIterable[T]] = ParArrayCombiner[T] } - - - - - - - - - - - - - - diff --git a/src/library/scala/collection/parallel/immutable/ParHashMap.scala b/src/library/scala/collection/parallel/immutable/ParHashMap.scala index 84705c33e7..11d4a02e18 100644 --- a/src/library/scala/collection/parallel/immutable/ParHashMap.scala +++ b/src/library/scala/collection/parallel/immutable/ParHashMap.scala @@ -146,7 +146,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll immutable.ParHashMap * @define coll immutable parallel hash map */ diff --git a/src/library/scala/collection/parallel/immutable/ParHashSet.scala b/src/library/scala/collection/parallel/immutable/ParHashSet.scala index 29c6eb0f93..e292a3ef72 100644 --- a/src/library/scala/collection/parallel/immutable/ParHashSet.scala +++ b/src/library/scala/collection/parallel/immutable/ParHashSet.scala @@ -127,7 +127,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll immutable.ParHashSet * @define coll immutable parallel hash set */ diff --git a/src/library/scala/collection/parallel/immutable/ParIterable.scala b/src/library/scala/collection/parallel/immutable/ParIterable.scala index c4da1ced8e..085f5220dd 100644 --- a/src/library/scala/collection/parallel/immutable/ParIterable.scala +++ b/src/library/scala/collection/parallel/immutable/ParIterable.scala @@ -44,7 +44,7 @@ extends collection.immutable.Iterable[T] } -/** $factoryinfo +/** $factoryInfo */ object ParIterable extends ParFactory[ParIterable] { implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = diff --git a/src/library/scala/collection/parallel/mutable/ParArray.scala b/src/library/scala/collection/parallel/mutable/ParArray.scala index f976098f5e..0ac009d58c 100644 --- a/src/library/scala/collection/parallel/mutable/ParArray.scala +++ b/src/library/scala/collection/parallel/mutable/ParArray.scala @@ -682,7 +682,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll mutable.ParArray * @define coll parallel array */ diff --git a/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala b/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala index 3bb3d4d763..f2205fbb17 100644 --- a/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala +++ b/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala @@ -6,21 +6,16 @@ ** |/ ** \* */ - package scala.collection package parallel.mutable - - - import collection.parallel.ParIterableIterator - - - /** Parallel flat hash table. * - * @tparam T type of the elements in the table + * @tparam T type of the elements in the $coll. + * @define coll table + * @define Coll flat hash table * * @author Aleksandar Prokopec */ diff --git a/src/library/scala/collection/parallel/mutable/ParHashMap.scala b/src/library/scala/collection/parallel/mutable/ParHashMap.scala index 2945bcdc61..a3f3c33af5 100644 --- a/src/library/scala/collection/parallel/mutable/ParHashMap.scala +++ b/src/library/scala/collection/parallel/mutable/ParHashMap.scala @@ -141,7 +141,7 @@ self => } -/** $factoryinfo +/** $factoryInfo * @define Coll mutable.ParHashMap * @define coll parallel hash map */ diff --git a/src/library/scala/collection/parallel/mutable/ParHashSet.scala b/src/library/scala/collection/parallel/mutable/ParHashSet.scala index 0b969d1cf0..6d82e1b6aa 100644 --- a/src/library/scala/collection/parallel/mutable/ParHashSet.scala +++ b/src/library/scala/collection/parallel/mutable/ParHashSet.scala @@ -6,12 +6,8 @@ ** |/ ** \* */ - package scala.collection.parallel.mutable - - - import collection.generic._ import collection.mutable.HashSet import collection.mutable.FlatHashTable @@ -19,18 +15,15 @@ import collection.parallel.Combiner import collection.parallel.EnvironmentPassingCombiner import collection.mutable.UnrolledBuffer - - - /** A parallel hash set. * * `ParHashSet` is a parallel set which internally keeps elements within a hash table. * It uses linear probing to resolve collisions. * - * @tparam T type of the elements in the parallel hash map + * @tparam T type of the elements in the $coll. * - * @define Coll ParHashMap - * @define coll parallel hash map + * @define Coll ParHashSet + * @define coll parallel hash set * * @author Aleksandar Prokopec */ @@ -317,7 +310,6 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] => } - private[parallel] object ParHashSetCombiner { private[mutable] val discriminantbits = 5 private[mutable] val numblocks = 1 << discriminantbits @@ -327,16 +319,3 @@ private[parallel] object ParHashSetCombiner { def apply[T] = new ParHashSetCombiner[T](FlatHashTable.defaultLoadFactor) with EnvironmentPassingCombiner[T, ParHashSet[T]] } - - - - - - - - - - - - - diff --git a/src/library/scala/collection/parallel/mutable/ParIterable.scala b/src/library/scala/collection/parallel/mutable/ParIterable.scala index fcba75452f..cd0c45bd0d 100644 --- a/src/library/scala/collection/parallel/mutable/ParIterable.scala +++ b/src/library/scala/collection/parallel/mutable/ParIterable.scala @@ -39,7 +39,7 @@ trait ParIterable[T] extends collection.mutable.Iterable[T] override def toSeq: ParSeq[T] = toParCollection[T, ParSeq[T]](() => ParSeq.newCombiner[T]) } -/** $factoryinfo +/** $factoryInfo */ object ParIterable extends ParFactory[ParIterable] { implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = diff --git a/src/library/scala/io/Position.scala b/src/library/scala/io/Position.scala index d08ed2d7e7..3cc7a481f3 100644 --- a/src/library/scala/io/Position.scala +++ b/src/library/scala/io/Position.scala @@ -6,97 +6,76 @@ ** |/ ** \* */ - - package scala.io -/** <p> - * The object <code>Position</code> provides convenience methods to encode - * line and column number in one single integer. The encode line (column) - * numbers range from 0 to <code>LINE_MASK</code> - * (<code>COLUMN_MASK</code>), where 0 indicates that the line (column) is - * the undefined and 1 represents the first line (column). Line (Column) - * numbers greater than <code>LINE_MASK</code> - * (<code>COLUMN_MASK</code>) are replaced by <code>LINE_MASK</code> - * (<code>COLUMN_MASK</code>). Furthermore, if the encoded line number is - * <code>LINE_MASK</code>, the column number is always set to 0. - * </p> - * <p> - * The following properties hold: - * </p> - * <ul> - * <li> - * the undefined position is 0: <code>encode(0,0) == 0</code> - * </li> - * <li> - * encodings are non-negative : <code>encode(line,column) >= 0</code> - * </li> - * <li> - * position order is preserved: - * <code>(line1 < line2) || (line1 == line2 && column1 < column2)</code> - * <div>implies</div> - * <code>encode(line1,column1) <= encode(line2,column2)</code> - * </li> - * </ul> +/** The object Position provides convenience methods to encode + * line and column number in one single integer. The encoded line + * (column) numbers range from 0 to LINE_MASK (COLUMN_MASK), + * where 0 indicates that the line (column) is undefined and 1 + * represents the first line (column). + * + * Line (Column) numbers greater than LINE_MASK (COLUMN_MASK) are + * replaced by LINE_MASK (COLUMN_MASK). Furthermore, if the encoded + * line number is LINE_MASK, the column number is always set to 0. + * + * The following properties hold: + * + * the undefined position is 0: encode(0,0) == 0 + * encodings are non-negative : encode(line,column) >= 0 + * position order is preserved: + * + * (line1 <= line2) || (line1 == line2 && column1 <= column2) + * implies + * encode(line1,column1) <= encode(line2,column2) * * @author Burak Emir (translated from work by Matthias Zenger and others) */ -object Position { +abstract class Position { + /** Definable behavior for overflow conditions. + */ + def checkInput(line: Int, column: Int): Unit /** Number of bits used to encode the line number */ final val LINE_BITS = 20 /** Number of bits used to encode the column number */ final val COLUMN_BITS = 31 - LINE_BITS // no negatives => 31 - /** Mask to decode the line number */ final val LINE_MASK = (1 << LINE_BITS) - 1 /** Mask to decode the column number */ final val COLUMN_MASK = (1 << COLUMN_BITS) - 1 - /** The undefined position */ - final val NOPOS = 0 - - /** The first position in a source file */ - final val FIRSTPOS = encode(1, 1) - /** Encodes a position into a single integer. */ final def encode(line: Int, column: Int): Int = { - var line1, column1 = 0 - if (line < 0) - throw new IllegalArgumentException(line + " < 0") - if ((line == 0) && (column != 0)) - throw new IllegalArgumentException(line + "," + column + " not allowed") - if (column < 0) - throw new IllegalArgumentException(line + "," + column + " not allowed") + checkInput(line, column) - if (line >= LINE_MASK) { - line1 = LINE_MASK - column1 = 0 - } - else { - line1 = line - if (column > COLUMN_MASK) - column1 = COLUMN_MASK - else - column1 = column - } - (line1 << COLUMN_BITS) | column1 + if (line >= LINE_MASK) + LINE_MASK << COLUMN_BITS + else + (line << COLUMN_BITS) | math.min(LINE_MASK, line) } /** Returns the line number of the encoded position. */ - final def line(pos: Int): Int = - (pos >> COLUMN_BITS) & LINE_MASK + final def line(pos: Int): Int = (pos >> COLUMN_BITS) & LINE_MASK /** Returns the column number of the encoded position. */ - final def column(pos: Int): Int = - pos & COLUMN_MASK + final def column(pos: Int): Int = pos & COLUMN_MASK /** Returns a string representation of the encoded position. */ - def toString(pos: Int): String = { - val sb = new StringBuilder - sb append line(pos) - sb append ':' - sb append column(pos) - sb.toString() + def toString(pos: Int): String = line(pos) + ":" + column(pos) +} + +object Position extends Position { + /** The undefined position */ + @deprecated("This will be removed") final val NOPOS = 0 + /** The first position in a source file */ + @deprecated("This will be removed") final val FIRSTPOS = encode(1, 1) + + def checkInput(line: Int, column: Int) { + if (line < 0) + throw new IllegalArgumentException(line + " < 0") + if ((line == 0) && (column != 0)) + throw new IllegalArgumentException(line + "," + column + " not allowed") + if (column < 0) + throw new IllegalArgumentException(line + "," + column + " not allowed") } } diff --git a/src/library/scala/io/Source.scala b/src/library/scala/io/Source.scala index 570c48a91a..c81f2bfed0 100644 --- a/src/library/scala/io/Source.scala +++ b/src/library/scala/io/Source.scala @@ -186,7 +186,6 @@ abstract class Source extends Iterator[Char] { /** description of this source, default empty */ var descr: String = "" - var nerrors = 0 var nwarnings = 0 @@ -242,7 +241,8 @@ abstract class Source extends Iterator[Char] { */ def next: Char = positioner.next - class Positioner { + class Positioner(encoder: Position) { + def this() = this(RelaxedPosition) /** the last character returned by next. */ var ch: Char = _ @@ -258,7 +258,7 @@ abstract class Source extends Iterator[Char] { def next: Char = { ch = iter.next - pos = Position.encode(cline, ccol) + pos = encoder.encode(cline, ccol) ch match { case '\n' => ccol = 1 @@ -271,7 +271,14 @@ abstract class Source extends Iterator[Char] { ch } } - object NoPositioner extends Positioner { + /** A Position implementation which ignores errors in + * the positions. + */ + object RelaxedPosition extends Position { + def checkInput(line: Int, column: Int): Unit = () + } + object RelaxedPositioner extends Positioner(RelaxedPosition) { } + object NoPositioner extends Positioner(Position) { override def next: Char = iter.next } def ch = positioner.ch @@ -321,7 +328,7 @@ abstract class Source extends Iterator[Char] { private[this] var resetFunction: () => Source = null private[this] var closeFunction: () => Unit = null - private[this] var positioner: Positioner = new Positioner + private[this] var positioner: Positioner = RelaxedPositioner def withReset(f: () => Source): this.type = { resetFunction = f @@ -335,10 +342,13 @@ abstract class Source extends Iterator[Char] { descr = text this } - // we'd like to default to no positioning, but for now we break - // less by defaulting to status quo. + /** Change or disable the positioner. */ def withPositioning(on: Boolean): this.type = { - positioner = if (on) new Positioner else NoPositioner + positioner = if (on) RelaxedPositioner else NoPositioner + this + } + def withPositioning(pos: Positioner): this.type = { + positioner = pos this } diff --git a/src/library/scala/math/Ordering.scala b/src/library/scala/math/Ordering.scala index eeb8c080a1..10e42a6de4 100644 --- a/src/library/scala/math/Ordering.scala +++ b/src/library/scala/math/Ordering.scala @@ -30,6 +30,7 @@ import java.util.Comparator * @version 0.9.5, 2008-04-15 * @since 2.7 */ +@annotation.implicitNotFound(msg = "No implicit Ordering defined for ${T}.") trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable { outer => diff --git a/src/library/scala/reflect/ClassManifest.scala b/src/library/scala/reflect/ClassManifest.scala index d18cfbc652..3f3892e802 100644 --- a/src/library/scala/reflect/ClassManifest.scala +++ b/src/library/scala/reflect/ClassManifest.scala @@ -144,16 +144,10 @@ trait ClassManifest[T] extends OptManifest[T] with Equals with Serializable { else "" } -/** <p> - * This object is used by the compiler and <b>should not be used in client - * code</b>. The object Manifest defines factory methods for - * manifests. - * </p> - * <p> - * <b>BE AWARE</b>: The factory for refinement types is missing and - * will be implemented in a later version of this class. - * </p> - */ +/** The object ClassManifest defines factory methods for manifests. + * It is intended for use by the compiler and should not be used + * in client code. + */ object ClassManifest { val Byte = Manifest.Byte val Short = Manifest.Short diff --git a/src/library/scala/reflect/Manifest.scala b/src/library/scala/reflect/Manifest.scala index 5545a43740..229fa728a8 100644 --- a/src/library/scala/reflect/Manifest.scala +++ b/src/library/scala/reflect/Manifest.scala @@ -10,17 +10,35 @@ package scala.reflect import scala.collection.mutable.{ ArrayBuilder, WrappedArray } -/** <p> - * A <code>Manifest[T]</code> is an opaque descriptor for type <code>T</code>. - * Currently, its only use is to give access to the erasure of the type as a - * <code>Class</code> instance. - * </p> - * <p> - * <b>BE AWARE</b>: The different type-relation operators are all forwarded - * to the erased type as an approximation of the final semantics where - * these operators should be on the unerased type. - * </p> - */ +/** A Manifest[T] is an opaque descriptor for type T. Its + * supported use is to give access to the erasure of the type + * as a Class instance, as is necessary for the creation of native + * Arrays if the class is not known at compile time. + * + * The type-relation operators <:< and =:= should be considered + * approximations only, as there are numerous aspects of type conformance + * which are not yet adequately represented in manifests. + * + * Example usages: +{{{ + def arr[T] = new Array[T](0) // does not compile + def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles + def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding + + // Methods manifest, classManifest, and optManifest are in [[scala.Predef]]. + def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U] + isApproxSubType[List[String], List[AnyRef]] // true + isApproxSubType[List[String], List[Int]] // false + + def methods[T: ClassManifest] = classManifest[T].erasure.getMethods + def retType[T: ClassManifest](name: String) = + methods[T] find (_.getName == name) map (_.getGenericReturnType) + + retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>) +}}} + * + */ +@annotation.implicitNotFound(msg = "No Manifest available for ${T}.") trait Manifest[T] extends ClassManifest[T] with Equals { override def typeArguments: List[Manifest[_]] = Nil @@ -52,16 +70,10 @@ trait AnyValManifest[T] extends Manifest[T] with Equals { override def hashCode = System.identityHashCode(this) } -/** <ps> - * This object is used by the compiler and <b>should not be used in client - * code</b>. The object <code>Manifest</code> defines factory methods for - * manifests. - * </p> - * <p> - * <b>BE AWARE</b>: The factory for refinement types is missing and - * will be implemented in a later version of this class. - * </p> - */ +/** The object Manifest defines factory methods for manifests. + * It is intended for use by the compiler and should not be used + * in client code. + */ object Manifest { private def ObjectClass = classOf[java.lang.Object] diff --git a/src/library/scala/reflect/NameTransformer.scala b/src/library/scala/reflect/NameTransformer.scala index 6cfb40cadf..7bc5a61f6c 100755 --- a/src/library/scala/reflect/NameTransformer.scala +++ b/src/library/scala/reflect/NameTransformer.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.reflect /** @@ -21,7 +19,6 @@ object NameTransformer { private val op2code = new Array[String](nops) private val code2op = new Array[OpCodes](ncodes) - private def enterOp(op: Char, code: String) = { op2code(op) = code val c = (code.charAt(1) - 'a') * 26 + code.charAt(2) - 'a' @@ -48,10 +45,10 @@ object NameTransformer { enterOp('?', "$qmark") enterOp('@', "$at") - /** Replace operator symbols by corresponding "<code>$op_name</code>". + /** Replace operator symbols by corresponding `\$opname`. * - * @param name ... - * @return ... + * @param name the string to encode + * @return the string with all recognized opchars replaced with their encoding */ def encode(name: String): String = { var buf: StringBuilder = null @@ -82,10 +79,10 @@ object NameTransformer { if (buf eq null) name else buf.toString() } - /** Replace <code>$op_name</code> by corresponding operator symbol. + /** Replace `\$opname` by corresponding operator symbol. * - * @param name0 ... - * @return ... + * @param name0 the string to decode + * @return the string with all recognized operator symbol encodings replaced with their name */ def decode(name0: String): String = { //System.out.println("decode: " + name);//DEBUG diff --git a/src/library/scala/reflect/Type.scala b/src/library/scala/reflect/Type.scala index 85b047d97c..5aa92b3828 100644 --- a/src/library/scala/reflect/Type.scala +++ b/src/library/scala/reflect/Type.scala @@ -6,12 +6,8 @@ ** |/ ** \* */ - - package scala.reflect -import collection.immutable.List - /** This type is required by the compiler and <b>should not be used in client code</b>. */ abstract class Type @@ -55,13 +51,6 @@ case class NullaryMethodType(resultType: Type) extends Type /** This type is required by the compiler and <b>should not be used in client code</b>. */ case class PolyType(typeParams: List[Symbol], typeBounds: List[(Type, Type)], resultType: Type) extends Type - -/** This type is required by the compiler and <b>should not be used in client code</b>. */ -class ImplicitMethodType(formals: List[Symbol], restpe: Type) -extends MethodType(formals, restpe) - - - /* Standard pattern match: case reflect.NoPrefix => @@ -72,7 +61,7 @@ extends MethodType(formals, restpe) case reflect.ThisType(clazz) => case reflect.AppliedType(tpe, args) => case reflect.TypeBounds(lo, hi) => - case reflect.MethodType(formals, restpe) => //can also be ImplicitMethodType + case reflect.MethodType(formals, restpe) => case reflect.NullaryMethodType(restpe) => case reflect.PolyType(typeParams, typeBounds, resultType) => */ diff --git a/src/library/scala/reflect/generic/PickleFormat.scala b/src/library/scala/reflect/generic/PickleFormat.scala index a1f988a22d..1667e8c24f 100755 --- a/src/library/scala/reflect/generic/PickleFormat.scala +++ b/src/library/scala/reflect/generic/PickleFormat.scala @@ -137,7 +137,7 @@ object PickleFormat { final val CLASSINFOtpe = 19 final val METHODtpe = 20 final val POLYtpe = 21 - final val IMPLICITMETHODtpe = 22 + final val IMPLICITMETHODtpe = 22 // no longer generated final val LITERAL = 23 // base line for literals final val LITERALunit = 24 diff --git a/src/library/scala/reflect/generic/Symbols.scala b/src/library/scala/reflect/generic/Symbols.scala index 770c6e920c..49cf7df1ef 100755 --- a/src/library/scala/reflect/generic/Symbols.scala +++ b/src/library/scala/reflect/generic/Symbols.scala @@ -25,11 +25,11 @@ trait Symbols { self: Universe => */ def name: Name - /** The name of the symbol before decoding, e.g. `$eq$eq` instead of `==`. + /** The name of the symbol before decoding, e.g. `\$eq\$eq` instead of `==`. */ def encodedName: String - /** The decoded name of the symbol, e.g. `==` instead of `$eq$eq`. + /** The decoded name of the symbol, e.g. `==` instead of `\$eq\$eq`. */ def decodedName: String = stripLocalSuffix(NameTransformer.decode(encodedName)) diff --git a/src/library/scala/runtime/RichUnit.scala b/src/library/scala/runtime/RichUnit.scala deleted file mode 100644 index 522b139cb4..0000000000 --- a/src/library/scala/runtime/RichUnit.scala +++ /dev/null @@ -1,22 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - - - -package scala.runtime - -/** This class exists only as a dummy subclass so that there are two ambiguous - * implicit conversions from Unit to some subclass to Object. - * It's important that this class should NOT inherit from Ordered. - * - * Note - in reality the ambiguity is successfully introduced by any2stringadd - * and orderingToOrdered, and adding an implicit from () => RichUnit actually - * resolves the ambiguity by being more specific, and succeeds! So this class - * is probably useless, and unitWrapper has been removed from Predef. - */ -final class RichUnit {} diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index 3168fedc40..41a63777c5 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -252,9 +252,8 @@ object ScalaRunTime { * called on null and (b) depending on the apparent type of an * array, toString may or may not print it in a human-readable form. * - * @param arg the value to stringify - * @return a string representation of <code>arg</code> - * + * @param arg the value to stringify + * @return a string representation of arg. */ def stringOf(arg: Any): String = stringOf(arg, scala.Int.MaxValue) def stringOf(arg: Any, maxElements: Int): String = { @@ -288,14 +287,18 @@ object ScalaRunTime { case (k, v) => inner(k) + " -> " + inner(v) case _ => inner(arg) } - // The recursively applied attempt to prettify Array printing + // The recursively applied attempt to prettify Array printing. + // Note that iterator is used if possible and foreach is used as a + // last resort, because the parallel collections "foreach" in a + // random order even on sequences. def inner(arg: Any): String = arg match { case null => "null" case "" => "\"\"" case x: String => if (x.head.isWhitespace || x.last.isWhitespace) "\"" + x + "\"" else x - case x if useOwnToString(x) => x.toString + case x if useOwnToString(x) => x toString case x: AnyRef if isArray(x) => WrappedArray make x take maxElements map inner mkString ("Array(", ", ", ")") - case x: collection.Map[_, _] => x take maxElements map mapInner mkString (x.stringPrefix + "(", ", ", ")") + case x: collection.Map[_, _] => x.iterator take maxElements map mapInner mkString (x.stringPrefix + "(", ", ", ")") + case x: Iterable[_] => x.iterator take maxElements map inner mkString (x.stringPrefix + "(", ", ", ")") case x: Traversable[_] => x take maxElements map inner mkString (x.stringPrefix + "(", ", ", ")") case x: Product1[_] if isTuple(x) => "(" + inner(x._1) + ",)" // that special trailing comma case x: Product if isTuple(x) => x.productIterator map inner mkString ("(", ",", ")") @@ -304,13 +307,16 @@ object ScalaRunTime { // The try/catch is defense against iterables which aren't actually designed // to be iterated, such as some scala.tools.nsc.io.AbstractFile derived classes. - val s = - try inner(arg) - catch { - case _: StackOverflowError | _: UnsupportedOperationException => arg.toString - } - + try inner(arg) + catch { + case _: StackOverflowError | _: UnsupportedOperationException | _: AssertionError => "" + arg + } + } + /** stringOf formatted for use in a repl result. */ + def replStringOf(arg: Any, maxElements: Int): String = { + val s = stringOf(arg, maxElements) val nl = if (s contains "\n") "\n" else "" + nl + s + "\n" } } diff --git a/src/library/scala/sys/BooleanProp.scala b/src/library/scala/sys/BooleanProp.scala index 85719103de..e940990785 100644 --- a/src/library/scala/sys/BooleanProp.scala +++ b/src/library/scala/sys/BooleanProp.scala @@ -46,6 +46,8 @@ object BooleanProp { def setValue[T1 >: Boolean](newValue: T1): Boolean = value def get: String = "" + value val clear, enable, disable, toggle = () + def option = if (isSet) Some(value) else None + protected def zero = false } diff --git a/src/library/scala/sys/Prop.scala b/src/library/scala/sys/Prop.scala index de38a56c73..33b88f119f 100644 --- a/src/library/scala/sys/Prop.scala +++ b/src/library/scala/sys/Prop.scala @@ -53,6 +53,10 @@ trait Prop[+T] { */ def get: String + /** Some(value) if the property is set, None otherwise. + */ + def option: Option[T] + /** Removes the property from the underlying map. */ def clear(): Unit @@ -69,11 +73,13 @@ object Prop { * parameter of type Creator[T] is in scope, a Prop[T] can be created * via this object's apply method. */ + @annotation.implicitNotFound("No implicit property creator available for type ${T}.") trait Creator[+T] { /** Creates a Prop[T] of this type based on the given key. */ def apply(key: String): Prop[T] } + implicit object FileProp extends CreatorImpl[java.io.File](s => new java.io.File(s)) implicit object StringProp extends CreatorImpl[String](s => s) implicit object IntProp extends CreatorImpl[Int](_.toInt) implicit object DoubleProp extends CreatorImpl[Double](_.toDouble) diff --git a/src/library/scala/sys/PropImpl.scala b/src/library/scala/sys/PropImpl.scala index 888e9d7327..b84553ea22 100644 --- a/src/library/scala/sys/PropImpl.scala +++ b/src/library/scala/sys/PropImpl.scala @@ -31,6 +31,8 @@ private[sys] class PropImpl[+T](val key: String, valueFn: String => T) extends P else "" def clear(): Unit = underlying -= key + def option: Option[T] = if (isSet) Some(value) else None + def or[T1 >: T](alt: => T1): T1 = if (isSet) value else alt /** The underlying property map, in our case always sys.props */ protected def underlying: mutable.Map[String, String] = scala.sys.props diff --git a/src/library/scala/sys/SystemProperties.scala b/src/library/scala/sys/SystemProperties.scala index 228ca6315e..296db9e469 100644 --- a/src/library/scala/sys/SystemProperties.scala +++ b/src/library/scala/sys/SystemProperties.scala @@ -55,14 +55,15 @@ object SystemProperties { implicit def systemPropertiesToCompanion(p: SystemProperties): SystemProperties.type = this private lazy val propertyHelp = mutable.Map[String, String]() - private def bool(key: String, helpText: String): BooleanProp = { - val prop = ( - if (key startsWith "java.") BooleanProp.valueIsTrue(key) - else BooleanProp.keyExists(key) - ) - propertyHelp(key) = helpText - prop + private def addHelp[P <: Prop[_]](p: P, helpText: String): P = { + propertyHelp(p.key) = helpText + p } + private def str(key: String, helpText: String) = addHelp(Prop[String](key), helpText) + private def bool(key: String, helpText: String): BooleanProp = addHelp[BooleanProp]( + if (key startsWith "java.") BooleanProp.valueIsTrue(key) else BooleanProp.keyExists(key), + helpText + ) def help(key: String) = propertyHelp.getOrElse(key, "") // Todo: bring some sanity to the intersection of system properties aka "mutable @@ -72,5 +73,6 @@ object SystemProperties { lazy val preferIPv4Stack = bool("java.net.preferIPv4Stack", "system should prefer IPv4 sockets") lazy val preferIPv6Addresses = bool("java.net.preferIPv6Addresses", "system should prefer IPv6 addresses") lazy val noTraceSupression = bool("scala.control.noTraceSuppression", "scala should not suppress any stack trace creation") + lazy val traceSourcePath = str("scala.control.sourcepath", "sourcepath for looking up stack trace elements") } diff --git a/src/library/scala/util/control/NoStackTrace.scala b/src/library/scala/util/control/NoStackTrace.scala index f33e8cd013..f5a844d2c9 100644 --- a/src/library/scala/util/control/NoStackTrace.scala +++ b/src/library/scala/util/control/NoStackTrace.scala @@ -11,7 +11,7 @@ package scala.util.control /** A trait for exceptions which, for efficiency reasons, do not * fill in the stack trace. Stack trace suppression can be disabled * on a global basis via a system property wrapper in - * [[ scala.sys.SystemProperties ]]. + * [[scala.sys.SystemProperties]]. * * @author Paul Phillips * @since 2.8 diff --git a/src/library/scala/util/logging/Logged.scala b/src/library/scala/util/logging/Logged.scala index 3ec70c00c6..01757e1bfa 100644 --- a/src/library/scala/util/logging/Logged.scala +++ b/src/library/scala/util/logging/Logged.scala @@ -6,34 +6,25 @@ ** |/ ** \* */ - - package scala.util.logging -/** <p> - * Mixing in the class <code>Logged</code> indicates that a class provides - * support for logging. For instance, the developer of a library writes - * </p> - * <pre> - * <b>class</b> MyClass <b>extends</b> Logged { /* do stuff, call log */ } - * </pre> - * <p> - * The user of the library instantiates: - * </p> - * <pre> - * <b>val</b> x = <b>new</b> MyClass() <b>with</b> ConsoleLogger - * </pre> - * <p> - * and the logging will be sent to the <a href="../../Console$object.html" - * target="contentFrame"><code>Console</code></a> object. - * </p> +/** Mixing in Logged indicates that a class provides support for logging. + * For instance: +{{{ + // The developer of the library writes: + class MyClass extends Logged { + // do stuff, call log + } + // The user of the library instantiates: + val x = new MyClass() with ConsoleLogger +}}} + * and the logging is sent to the [[scala.util.logging.ConsoleLogger]] object. */ trait Logged { - /** This method should log the message given as argument somewhere * as a side-effect. * - * @param msg ... + * @param msg message to be logged */ def log(msg: String): Unit = {} } diff --git a/src/library/scala/xml/Attribute.scala b/src/library/scala/xml/Attribute.scala index dfee02c48a..5b69017e70 100644 --- a/src/library/scala/xml/Attribute.scala +++ b/src/library/scala/xml/Attribute.scala @@ -64,16 +64,6 @@ abstract trait Attribute extends MetaData { (next(arg, scope, key) == null) && (next wellformed scope) } - override def canEqual(other: Any) = other match { - case _: Attribute => true - case _ => false - } - override def strict_==(other: Equality) = other match { - case x: Attribute => (pre == x.pre) && (key == x.key) && (value sameElements x.value) && (next == x.next) - case _ => false - } - override def basisForHashCode = List(pre, key, value) - /** Appends string representation of only this attribute to stringbuffer. */ def toString1(sb: StringBuilder) { diff --git a/src/library/scala/xml/Elem.scala b/src/library/scala/xml/Elem.scala index b068a1a17d..4ea7e90de2 100644 --- a/src/library/scala/xml/Elem.scala +++ b/src/library/scala/xml/Elem.scala @@ -17,8 +17,7 @@ package scala.xml * Copyright 2008 Google Inc. All Rights Reserved. * @author Burak Emir <bqe@google.com> */ -object Elem -{ +object Elem { def apply(prefix: String,label: String, attributes: MetaData, scope: NamespaceBinding, child: Node*) = new Elem(prefix,label,attributes,scope,child:_*) diff --git a/src/library/scala/xml/MetaData.scala b/src/library/scala/xml/MetaData.scala index ff3071e050..2e55a9d67e 100644 --- a/src/library/scala/xml/MetaData.scala +++ b/src/library/scala/xml/MetaData.scala @@ -71,8 +71,7 @@ object MetaData { * Copyright 2008 Google Inc. All Rights Reserved. * @author Burak Emir <bqe@google.com> */ -abstract class MetaData extends Iterable[MetaData] with Equality with Serializable -{ +abstract class MetaData extends Iterable[MetaData] with Equality with Serializable { /** Updates this MetaData with the MetaData given as argument. All attributes that occur in updates * are part of the resulting MetaData. If an attribute occurs in both this instance and * updates, only the one in updates is part of the result (avoiding duplicates). For prefixed @@ -135,10 +134,10 @@ abstract class MetaData extends Iterable[MetaData] with Equality with Serializab case _ => false } override def strict_==(other: Equality) = other match { - case m: MetaData => this.toSet == m.toSet + case m: MetaData => this.asAttrMap == m.asAttrMap case _ => false } - def basisForHashCode: Seq[Any] = List(this.toSet) + def basisForHashCode: Seq[Any] = List(this.asAttrMap) /** Returns an iterator on attributes */ def iterator: Iterator[MetaData] = Iterator.single(this) ++ next.iterator diff --git a/src/library/scala/xml/include/sax/EncodingHeuristics.scala b/src/library/scala/xml/include/sax/EncodingHeuristics.scala index 349187437d..eaf0dffca8 100644 --- a/src/library/scala/xml/include/sax/EncodingHeuristics.scala +++ b/src/library/scala/xml/include/sax/EncodingHeuristics.scala @@ -14,14 +14,11 @@ import scala.xml.include._ import java.io.InputStream import scala.util.matching.Regex -/** - * <p> - * <code>EncodingHeuristics</code> reads from a stream +/** `EncodingHeuristics` reads from a stream * (which should be buffered) and attempts to guess * what the encoding of the text in the stream is. * If it fails to determine the type of the encoding, * it returns the default UTF-8. - * </p> * * @author Burak Emir * @author Paul Phillips @@ -40,16 +37,13 @@ object EncodingHeuristics } import EncodingNames._ - /** - * <p> - * This utility method attempts to determine the XML character encoding - * by examining the input stream, as specified here: - * http://www.w3.org/TR/xml/#sec-guessing - * </p> + /** This utility method attempts to determine the XML character encoding + * by examining the input stream, as specified at + * [[http://www.w3.org/TR/xml/#sec-guessing w3]]. * - * @param in <code>InputStream</code> to read from. - * @return String The name of the encoding. + * @param in `InputStream` to read from. * @throws IOException if the stream cannot be reset + * @return the name of the encoding. */ def readEncodingFromStream(in: InputStream): String = { var ret: String = null diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala index 4188f8b084..3902967626 100755 --- a/src/library/scala/xml/pull/XMLEventReader.scala +++ b/src/library/scala/xml/pull/XMLEventReader.scala @@ -24,8 +24,7 @@ import scala.xml.parsing.{ ExternalSources, MarkupHandler, MarkupParser } * @author Burak Emir * @author Paul Phillips */ -class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent] -{ +class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent] { // We implement a pull parser as an iterator, but since we may be operating on // a stream (e.g. XML over a network) there may be arbitrarily long periods when // the queue is empty. Fortunately the ProducerConsumerIterator is ideally diff --git a/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java b/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java index aefb6fdaf1..0f2c4e6764 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java @@ -108,20 +108,20 @@ public class Attribute { private static final Map id2type = new HashMap(); static { map("Boolean", Signature.ELEMENT_TYPE_BOOLEAN); - map("Char", Signature.ELEMENT_TYPE_CHAR); - map("SByte", Signature.ELEMENT_TYPE_I1); - map("Byte", Signature.ELEMENT_TYPE_U1); - map("Int16", Signature.ELEMENT_TYPE_I2); - map("UInt16", Signature.ELEMENT_TYPE_U2); - map("Int32", Signature.ELEMENT_TYPE_I4); - map("UInt32", Signature.ELEMENT_TYPE_U4); - map("Int64", Signature.ELEMENT_TYPE_I8); - map("UInt64", Signature.ELEMENT_TYPE_U8); - map("Single", Signature.ELEMENT_TYPE_R4); - map("Double", Signature.ELEMENT_TYPE_R8); - map("String", Signature.ELEMENT_TYPE_STRING); - map("Type", Signature.X_ELEMENT_TYPE_TYPE); - map("Object", Signature.ELEMENT_TYPE_OBJECT); + map("Char", Signature.ELEMENT_TYPE_CHAR); + map("SByte", Signature.ELEMENT_TYPE_I1); + map("Byte", Signature.ELEMENT_TYPE_U1); + map("Int16", Signature.ELEMENT_TYPE_I2); + map("UInt16", Signature.ELEMENT_TYPE_U2); + map("Int32", Signature.ELEMENT_TYPE_I4); + map("UInt32", Signature.ELEMENT_TYPE_U4); + map("Int64", Signature.ELEMENT_TYPE_I8); + map("UInt64", Signature.ELEMENT_TYPE_U8); + map("Single", Signature.ELEMENT_TYPE_R4); + map("Double", Signature.ELEMENT_TYPE_R8); + map("String", Signature.ELEMENT_TYPE_STRING); + map("Type", Signature.X_ELEMENT_TYPE_TYPE); + map("Object", Signature.ELEMENT_TYPE_OBJECT); } private static void map(String type, int id) { Type t = Type.GetType("System." + type); @@ -150,42 +150,102 @@ public class Attribute { private void parseBlob0() { if (buf != null) return; - buf = ByteBuffer.wrap(value); + buf = ByteBuffer.wrap(value); // Sec. 23.3 in Partition II of CLR Spec. buf.order(ByteOrder.LITTLE_ENDIAN); - short sig = buf.getShort(); + short sig = buf.getShort(); // Prolog assert sig == 1 : PEFile.bytes2hex(value); ParameterInfo[] params = constr.GetParameters(); constrArgs = new Object[params.length]; for (int i = 0; i < params.length; i++) { - constrArgs[i] = parseElement(params[i].ParameterType); + constrArgs[i] = parseFixedArg(params[i].ParameterType); // FixedArg } - int ncount = buf.getShort(); + int ncount = buf.getShort(); // NumNamed namedArgs = new LinkedHashMap(); for (int i = 0; i < ncount; i++) { - int designator = buf.get(); + int designator = buf.get(); // designator one of 0x53 (FIELD) or 0x54 (PROPERTY) assert designator == Signature.X_ELEMENT_KIND_FIELD || designator == Signature.X_ELEMENT_KIND_PROPERTY : "0x" + PEFile.byte2hex(designator); - Type type = parseType(); - String name = parseString(); - Object value = parseElement(type); + Type type = parseFieldOrPropTypeInNamedArg(); // FieldOrPropType + String name = parseString(); // FieldOrPropName + Object value = parseFixedArg(type); // FixedArg NamedArgument narg = new NamedArgument(designator, name, type, value); namedArgs.put(name, narg); } } - private Object parseElement(Type type) { - if (type.IsArray()) + private Object parseFixedArg(Type type) { + if (type.IsArray()) return parseArray(type.GetElementType()); - if (type.IsEnum()) - return parseElement(type.getUnderlyingType()); - return parseElement(getTypeId(type)); + else + return parseElem(type); + } + + /* indicates whether the "simple" case (the other is "enum") of the first row + in the Elem production should be taken. */ + private boolean isSimpleElem(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + switch(id){ + case Signature.ELEMENT_TYPE_STRING: + case Signature.X_ELEMENT_TYPE_TYPE: + case Signature.ELEMENT_TYPE_OBJECT: + return false; + default: + return true; + } } - private Object parseElement(int id) { + /* indicates whether the second row in the Elem production + should be taken (and more specifically, "string" case within that row). */ + private boolean isStringElem(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + return id == Signature.ELEMENT_TYPE_STRING; + } + + /* indicates whether the second row in the Elem production + should be taken (and more specifically, "type" case within that row). */ + private boolean isTypeElem(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + return id == Signature.X_ELEMENT_TYPE_TYPE; + } + + /* indicates whether the third row in the Elem production + should be taken (and more specifically, "boxed" case within that row). */ + private boolean isSystemObject(Type type) { + if(!type2id.containsKey(type)) return false; + int id = getTypeId(type); + return id == Signature.ELEMENT_TYPE_OBJECT; + } + + private Object parseElem(Type type) { + // simple or enum + if (isSimpleElem(type)) return parseVal(getTypeId(type)); + if (type.IsEnum()) return parseVal(getTypeId(type.getUnderlyingType())); + // string or type + if (isStringElem(type)) return parseString(); + if (isTypeElem(type)) return getTypeFromSerString(); + // boxed valuetype, please notice that a "simple" boxed valuetype is preceded by 0x51 + if (isSystemObject(type)) { + Type boxedT = parse0x51(); + if(boxedT.IsEnum()) { + return new BoxedArgument(boxedT, parseVal(getTypeId(boxedT.getUnderlyingType()))); + } else { + return new BoxedArgument(boxedT, parseVal(getTypeId(boxedT))); // TODO dead code? + } + } else { + Type boxedT = parseType(); + return parseVal(getTypeId(boxedT)); + } + } + + /* this does not parse an Elem, but a made-up production (Element). Don't read too much into this method name! */ + private Object parseVal(int id) { switch (id) { case Signature.ELEMENT_TYPE_BOOLEAN: return new Boolean(buf.get() == 0 ? false : true); @@ -193,29 +253,26 @@ public class Attribute { return new Character(buf.getChar()); case Signature.ELEMENT_TYPE_I1: case Signature.ELEMENT_TYPE_U1: - return new Byte(buf.get()); + return new Byte(buf.get()); // TODO U1 not the same as I1 case Signature.ELEMENT_TYPE_I2: case Signature.ELEMENT_TYPE_U2: - return new Short(buf.getShort()); + return new Short(buf.getShort()); // TODO U2 not the same as I2 case Signature.ELEMENT_TYPE_I4: case Signature.ELEMENT_TYPE_U4: - return new Integer(buf.getInt()); + return new Integer(buf.getInt()); // TODO U4 not the same as I4 case Signature.ELEMENT_TYPE_I8: case Signature.ELEMENT_TYPE_U8: - return new Long(buf.getLong()); + return new Long(buf.getLong()); // TODO U8 not the same as I8 case Signature.ELEMENT_TYPE_R4: return new Float(buf.getFloat()); case Signature.ELEMENT_TYPE_R8: return new Double(buf.getDouble()); + case Signature.X_ELEMENT_TYPE_TYPE: + return getTypeFromSerString(); case Signature.ELEMENT_TYPE_STRING: return parseString(); - case Signature.X_ELEMENT_TYPE_TYPE: - return getType(); - case Signature.ELEMENT_TYPE_OBJECT: - Type type = parseType(); - return new BoxedArgument(type, parseElement(type)); default: - throw new RuntimeException("Unknown type id: " + id); + throw new RuntimeException("Shouldn't have called parseVal with: " + id); } } @@ -232,7 +289,7 @@ public class Attribute { case Signature.ELEMENT_TYPE_CHAR: return parseCharArray(); case Signature.ELEMENT_TYPE_I1: - case Signature.ELEMENT_TYPE_U1: + case Signature.ELEMENT_TYPE_U1: // TODO U1 not the same as I1 return parseByteArray(); case Signature.ELEMENT_TYPE_I2: case Signature.ELEMENT_TYPE_U2: @@ -250,19 +307,61 @@ public class Attribute { case Signature.ELEMENT_TYPE_STRING: return parseStringArray(); case Signature.X_ELEMENT_TYPE_ENUM: - return parseArray(getType()); + return parseArray(getTypeFromSerString()); default: throw new RuntimeException("Unknown type id: " + id); } } - private Type parseType() { + private Type parseType() { // FieldOrPropType, Sec. 23.3 in Partition II of CLR Spec. + int id = buf.get(); + switch (id) { + case Signature.ELEMENT_TYPE_SZARRAY: + Type arrT = Type.mkArray(parseType(), 1); + return arrT; + case Signature.X_ELEMENT_TYPE_ENUM: + String enumName = parseString(); + Type enumT = Type.getType(enumName); + return enumT; + default: + Type t = (Type)id2type.get(new Integer(id)); + assert t != null : PEFile.byte2hex(id); + return t; + } + } + + private Type parse0x51() { int id = buf.get(); switch (id) { + case 0x51: + return parse0x51(); case Signature.ELEMENT_TYPE_SZARRAY: - return Type.mkArray(parseType(), 1); + Type arrT = Type.mkArray(parseType(), 1); + return arrT; + case Signature.X_ELEMENT_TYPE_ENUM: + String enumName = parseString(); + Type enumT = Type.getType(enumName); + return enumT; + default: + Type t = (Type)id2type.get(new Integer(id)); + assert t != null : PEFile.byte2hex(id); + return t; + } + } + + + private Type parseFieldOrPropTypeInNamedArg() { // FieldOrPropType, Sec. 23.3 in Partition II of CLR Spec. + int id = buf.get(); + switch (id) { + case 0x51: + return (Type)(id2type.get(new Integer(Signature.ELEMENT_TYPE_OBJECT))); + // TODO remove case Signature.ELEMENT_TYPE_SZARRAY: + // Type arrT = Type.mkArray(parseType(), 1); + // return arrT; case Signature.X_ELEMENT_TYPE_ENUM: - return getType(); + String enumName = parseString(); + Type enumT = Type.getType(enumName); // TODO this "lookup" only covers already-loaded assemblies. + return enumT; // TODO null as return value (due to the above) spells trouble later. default: Type t = (Type)id2type.get(new Integer(id)); assert t != null : PEFile.byte2hex(id); @@ -270,13 +369,11 @@ public class Attribute { } } - private Type getType() { + private Type getTypeFromSerString() { String typename = parseString(); int i = typename.indexOf(','); - // fully qualified assembly name follows - // just strip it on the assumtion theat the - // assembly is referenced in the externs and the - // type will be found + /* fully qualified assembly name follows. Just strip it on the assumption that + the assembly is referenced in the externs and the type will be found. */ String name = (i < 0) ? typename : typename.substring(0, i); Type t = Type.GetType(name); if (t == null && i > 0) { @@ -358,7 +455,7 @@ public class Attribute { return arr; } - private String parseString() { + private String parseString() { // SerString convention String str = null; int length = parseLength(); if (length < 0) @@ -541,7 +638,7 @@ public class Attribute { //########################################################################## - protected static final class BoxedArgument { + public static class BoxedArgument { public final Type type; public final Object value; public BoxedArgument(Type type, Object value) { diff --git a/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java b/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java new file mode 100644 index 0000000000..cf30008c60 --- /dev/null +++ b/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java @@ -0,0 +1,45 @@ +package ch.epfl.lamp.compiler.msil; + +/** + * Quoting from the CIL spec, Partition II, Sec. 7.1.1: + * + * Custom modifiers, defined using `modreq` (required modifier) and `modopt` (optional modifier), are + * similar to custom attributes (Sec. 21) except that modifiers are part of a signature rather than being attached to a + * declaration. Each modifer associates a type reference with an item in the signature. + * + */ +public class CustomModifier { + + public boolean isReqd; + public Type marker; + + public CustomModifier(boolean isReqd, Type marker) { + this.isReqd = isReqd; + this.marker = marker; + } + + public String toString() { + String res = (isReqd ? "modreq( " : "modopt( ") + marker.toString() + " )"; + return res; + } + + public static Type[] helperCustomMods(boolean isReqd, CustomModifier[] cmods) { + if(cmods == null) return null; + int count = 0; + for (int idx = 0; idx < cmods.length; idx++) { + if(cmods[idx].isReqd == isReqd) count++; + } + Type[] res = new Type[count]; + int residx = 0; + for (int idx = 0; idx < cmods.length; idx++) { + res[residx] = cmods[idx].marker; + residx++; + } + return res; + } + + public static Type VolatileMarker() { + return Type.GetType("System.Runtime.CompilerServices.IsVolatile"); + } + +} diff --git a/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java b/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java index 9649dabd4e..536a67e9a8 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java @@ -5,13 +5,15 @@ package ch.epfl.lamp.compiler.msil; +import ch.epfl.lamp.compiler.msil.util.PECustomMod; + /** * Discovers the attributes of a field and provides access to field metadata. * * @author Nikolay Mihaylov * @version 1.0 */ -public class FieldInfo extends MemberInfo { +public class FieldInfo extends MemberInfo implements HasCustomModifiers { //########################################################################## // public interface @@ -24,6 +26,9 @@ public class FieldInfo extends MemberInfo { /** Type of the field represented by this FieldInfo object. */ public final Type FieldType; + /** can be null */ + public final CustomModifier[] cmods; + protected final Object value; public final boolean IsStatic() { @@ -80,6 +85,33 @@ public class FieldInfo extends MemberInfo { return (Attributes & FieldAttributes.NotSerialized) != 0; } + private boolean knownVolatile = false; + private boolean cachedVolatile = false; + public final boolean IsVolatile() { + if(knownVolatile) return cachedVolatile; + knownVolatile = true; + if(cmods == null) { + cachedVolatile = false; + return cachedVolatile; + } + for (int idx = 0; idx < cmods.length; idx++) { + if(cmods[idx].marker == CustomModifier.VolatileMarker()) { + cachedVolatile = true; + return cachedVolatile; + } + } + cachedVolatile = false; + return cachedVolatile; + } + + public final Type[] GetOptionalCustomModifiers () { + return CustomModifier.helperCustomMods(false, cmods); + } + + public final Type[] GetRequiredCustomModifiers() { + return CustomModifier.helperCustomMods(true, cmods); + } + public String toString() { return FieldAttributes.toString(Attributes) + " " + FieldType + " " + DeclaringType.FullName + "::" + Name; @@ -90,17 +122,14 @@ public class FieldInfo extends MemberInfo { protected static final FieldInfo[] EMPTY_ARRAY = new FieldInfo[0]; /** Initializes a new instance of the FieldInfo class. */ - protected FieldInfo(String name, Type declType, int attrs, Type fieldType) { - this(name, declType, attrs, fieldType, null); - } - protected FieldInfo(String name, Type declType, - int attrs, Type fieldType, Object value) + int attrs, PECustomMod fieldTypeWithMods, Object value) { - super(name, declType); - FieldType = fieldType; - Attributes = (short) attrs; - this.value = value; + super(name, declType); + FieldType = fieldTypeWithMods.marked; + cmods = fieldTypeWithMods.cmods; + Attributes = (short) attrs; + this.value = value; } /** diff --git a/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java b/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java new file mode 100644 index 0000000000..5ead087350 --- /dev/null +++ b/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java @@ -0,0 +1,9 @@ +package ch.epfl.lamp.compiler.msil; + +public interface HasCustomModifiers { + + public Type[] GetOptionalCustomModifiers(); + + public Type[] GetRequiredCustomModifiers(); + +} diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java b/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java index d6d12c8b4a..481d5f2116 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java @@ -873,10 +873,11 @@ public class PEFile { return type; } // decodeType0() - public Type decodeFieldType() { - skipByte(FIELD); - skipCustomMods(); - return decodeType(); + public PECustomMod decodeFieldType() { + skipByte(FIELD); // 0x06 + CustomModifier[] cmods = getCustomMods(); + Type fieldType = decodeType(); + return new PECustomMod(fieldType, cmods); } /** decodes the return type of a method signature (22.2.11). */ @@ -908,10 +909,10 @@ public class PEFile { } public void skipCustomMods() { - while (getByte() == ELEMENT_TYPE_CMOD_OPT - || getByte() == ELEMENT_TYPE_CMOD_REQD) + while (getByte() == ELEMENT_TYPE_CMOD_OPT /* 0x20 */ + || getByte() == ELEMENT_TYPE_CMOD_REQD /* 0x1f */ ) { - boolean isREQD = (getByte() == ELEMENT_TYPE_CMOD_REQD); + boolean isREQD = (getByte() == ELEMENT_TYPE_CMOD_REQD); // 0x1f // skip the tag 23.2.7 readByte(); // skip the TypeDefOrRefEncoded (23.2.8) @@ -923,7 +924,22 @@ public class PEFile { } } - //###################################################################### + /** + * @see CustomModifier + */ + public CustomModifier[] getCustomMods() { + java.util.List/*<CustomModifier>*/ cmods = new java.util.LinkedList(); + while (getByte() == ELEMENT_TYPE_CMOD_OPT || getByte() == ELEMENT_TYPE_CMOD_REQD) { + boolean isReqd = (getByte() == ELEMENT_TYPE_CMOD_REQD); + readByte(); // tag 23.2.7 + Type t = pemodule.getTypeDefOrRef(decodeInt()); // TypeDefOrRefEncoded (23.2.8) + cmods.add(new CustomModifier(isReqd, t)); + } + CustomModifier[] res = (CustomModifier[])cmods.toArray(new CustomModifier[0]); + return res; + } + + //###################################################################### } // class Sig diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PEType.java b/src/msil/ch/epfl/lamp/compiler/msil/PEType.java index 25e5373df1..418c6603b3 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/PEType.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/PEType.java @@ -10,6 +10,7 @@ import ch.epfl.lamp.compiler.msil.PEFile.Sig; import ch.epfl.lamp.compiler.msil.util.Table; import ch.epfl.lamp.compiler.msil.util.Table.*; import ch.epfl.lamp.compiler.msil.util.Signature; +import ch.epfl.lamp.compiler.msil.util.PECustomMod; import java.util.ArrayList; @@ -83,7 +84,7 @@ final class PEType extends Type implements Signature { String name = file.FieldDef.getName(); //System.out.println("\t-->Loading field: " + name); Sig sig = file.FieldDef.getSignature(); - Type fieldType = sig.decodeFieldType(); + PECustomMod pecmod = sig.decodeFieldType(); Object val = null; Table.Constant consts = file.Constant; for (int i = 1; i <= consts.rows; i++) { @@ -93,10 +94,8 @@ final class PEType extends Type implements Signature { if (tableId == Table.FieldDef.ID && refRow == frow) val = consts.getValue(); } - FieldInfo field = - new PEFieldInfo(row, name, attrs, fieldType, val); - if (field.Name.equals("value__") && field.IsSpecialName()) - { + FieldInfo field = new PEFieldInfo(row, name, attrs, pecmod, val); + if (field.Name.equals("value__") && field.IsSpecialName()) { assert underlyingType == null : underlyingType.toString(); underlyingType = field.FieldType; } @@ -158,8 +157,7 @@ final class PEType extends Type implements Signature { //System.out.println("Retval attributes 0x" + // PEFile.short2hex(pattr)); } else { - params[seq - 1] = new ParameterInfo - (paramName, paramType[seq - 1], pattr, seq - 1); + params[seq - 1] = new ParameterInfo(paramName, paramType[seq - 1], pattr, seq - 1); } } for (int i = 0; i < params.length; i++) { @@ -351,9 +349,9 @@ final class PEType extends Type implements Signature { private class PEFieldInfo extends FieldInfo { private final int definingRow; public PEFieldInfo(int definingRow, String name, - int attrs, Type fieldType, Object value) + int attrs, PECustomMod pecmod, Object value) { - super(name, PEType.this, attrs, fieldType, value); + super(name, PEType.this, attrs, pecmod, value); this.definingRow = definingRow; } protected void loadCustomAttributes(Type attributeType) { diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java b/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java index ccca52edba..b19fe29869 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java @@ -1,5 +1,7 @@ package ch.epfl.lamp.compiler.msil; +import ch.epfl.lamp.compiler.msil.util.PECustomMod; + public final class PrimitiveType extends Type { public PrimitiveType(Module module, int attributes, @@ -31,7 +33,8 @@ public final class PrimitiveType extends Type { } public FieldInfo addField(String name, int attrs, Type fieldType) { - FieldInfo res = new FieldInfo(name, this, attrs, fieldType); + PECustomMod fieldTypeWithMods = new PECustomMod(fieldType, null); + FieldInfo res = new FieldInfo(name, this, attrs, fieldTypeWithMods, null); FieldInfo[] ms = new FieldInfo[fields.length + 1]; System.arraycopy(fields, 0, ms, 0, fields.length); ms[ms.length - 1] = res; diff --git a/src/msil/ch/epfl/lamp/compiler/msil/Type.java b/src/msil/ch/epfl/lamp/compiler/msil/Type.java index b2489ab66e..830632ce45 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/Type.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/Type.java @@ -315,6 +315,18 @@ public abstract class Type extends MemberInfo { return false; } + public boolean IsNestedType() { + return DeclaringType != null; + } + + public boolean IsDefinitelyInternal() { + if(IsNestedType()) { + return IsNestedPrivate(); + } else { + return IsNotPublic(); + } + } + //public final boolean IsCOMObject; //public final boolean IsContextful; //public final boolean IsMarshalByRef; diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala index 3ea06382e5..7ef9dc7a5b 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala +++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala @@ -9,6 +9,9 @@ import ch.epfl.lamp.compiler.msil.FieldInfo import ch.epfl.lamp.compiler.msil.Type import ch.epfl.lamp.compiler.msil.FieldAttributes import ch.epfl.lamp.compiler.msil.ConstructorInfo + +import ch.epfl.lamp.compiler.msil.util.PECustomMod + import java.io.IOException /** @@ -17,8 +20,8 @@ import java.io.IOException * @author Nikolay Mihaylov * @version 1.0 */ -class FieldBuilder(name: String, declType: Type, attrs: Int, fieldType: Type) - extends FieldInfo(name, declType, attrs, fieldType) +class FieldBuilder(name: String, declType: Type, attrs: Int, fieldTypeWithMods: PECustomMod) + extends FieldInfo(name, declType, attrs, fieldTypeWithMods, null) with ICustomAttributeSetter with Visitable { diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala index 73bc0f435c..d3a57194da 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala +++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala @@ -271,7 +271,7 @@ abstract class ILPrinterVisitor extends Visitor { // [[int32]] <fieldAttr>* <type> <id> [= <fieldInit> | at <dataLabel>] print(".field ") print(FieldAttributes.toString(field.Attributes)) - print(" "); printSignature(field.FieldType) + print(" "); printSignature(field.FieldType, field.cmods) print(" \'"); print(field.Name); print("\'") if (field.IsLiteral()) { print(" = ") @@ -608,16 +608,16 @@ abstract class ILPrinterVisitor extends Visitor { } - def printSignature(field: FieldInfo) { - printSignature(field.FieldType) - //print(' ') print(owner) - print(' ') - //if (field.IsStatic && field.DeclaringType != currentType) { - printReference(field.DeclaringType) - print("::") - //} - printName(field.Name) - } + def printSignature(field: FieldInfo) { + printSignature(field.FieldType, field.cmods) + //print(' ') print(owner) + print(' ') + //if (field.IsStatic && field.DeclaringType != currentType) { + printReference(field.DeclaringType) + print("::") + //} + printName(field.Name) + } // print method head @throws(classOf[IOException]) @@ -670,7 +670,19 @@ abstract class ILPrinterVisitor extends Visitor { print(")") } - def printSignature(`type`: Type) { + def printSignature(marked: Type, cmods: Array[CustomModifier]) { + printSignature(marked) + if( (cmods != null) && !cmods.isEmpty ) { + print(" ") + for(cm <- cmods) { + print(if (cm.isReqd) "modreq( " else "modopt( ") + printReference(cm.marker) + print(" ) ") + } + } + } + + def printSignature(`type`: Type) { val sigOpt = primitive.get(`type`) if (sigOpt.isDefined) { print(sigOpt.get) diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala index 663b2c5cb0..5126a0c34d 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala +++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala @@ -6,6 +6,9 @@ package ch.epfl.lamp.compiler.msil.emit import ch.epfl.lamp.compiler.msil._ + +import ch.epfl.lamp.compiler.msil.util.PECustomMod + import java.io.IOException /** @@ -38,15 +41,22 @@ class TypeBuilder (module: Module, attributes: Int, fullName: String, baseType: } /** - * Adds a new field to the class, with the given name, - * attributes and field type. + * Adds a new field to the class, with the given name, attributes and field type. The location has no custom mods. */ - def DefineField(name: String, `type`: Type, attrs: Short): FieldBuilder = { - val field: FieldBuilder = new FieldBuilder(name, this, attrs, `type`) - fieldBuilders += field - return field + def DefineField(name: String, fieldType: Type, attrs: Short): FieldBuilder = { + val fieldTypeWithCustomMods = new PECustomMod(fieldType, null) + DefineField(name, fieldTypeWithCustomMods, attrs) } + /** + * Adds a new field to the class, with the given name, attributes and (field type , custom mods) combination. + */ + def DefineField(name: String, fieldTypeWithMods: PECustomMod, attrs: Short): FieldBuilder = { + val field: FieldBuilder = new FieldBuilder(name, this, attrs, fieldTypeWithMods) + fieldBuilders += field + return field + } + /** * Adds a new method to the class, with the given name and * method signature. diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java b/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java new file mode 100644 index 0000000000..56519e8487 --- /dev/null +++ b/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java @@ -0,0 +1,23 @@ +package ch.epfl.lamp.compiler.msil.util; + +import ch.epfl.lamp.compiler.msil.Type; +import ch.epfl.lamp.compiler.msil.CustomModifier; + +/** + * A PECustomMod holds the info parsed from metadata per the CustomMod production in Sec. 23.2.7, Partition II. + * */ +public final class PECustomMod { + + public final Type marked; + public final CustomModifier[] cmods; + + /** Terminology: + the CustomModifier(s) are markers, + and the msil.Type is a type marked by those markers. */ + public PECustomMod(Type marked, CustomModifier[] cmods) { + this.marked = marked; + this.cmods = cmods; + } + +} + diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java b/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java index ef043875ec..649d9e74f2 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java @@ -152,7 +152,7 @@ public final class PEStream implements Signature { assert length == 2 : "length == " + length; return new Character(buffer.getChar()); case ELEMENT_TYPE_I1: - case ELEMENT_TYPE_U1: + case ELEMENT_TYPE_U1: // TODO U1 not the same as I1 assert length == 1; return new Byte(buffer.get()); case ELEMENT_TYPE_I2: diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java b/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java index 119d9e6ba3..1f43b8c2fa 100644 --- a/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java +++ b/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java @@ -1615,7 +1615,7 @@ public abstract class Table { public int Number; public int Flags; - public int Owner; // a TypeOrMethodDef (§24.2.6) coded index + public int Owner; // a TypeOrMethodDef (Sec 24.2.6) coded index public int Name; // a non-null index into the String heap private java.util.Map /*<Integer, java.util.Set<Integer>>*/ GenericParamIdxesForMethodDefIdx = @@ -1760,7 +1760,7 @@ public abstract class Table { public static final int ID = 0x2c; public int Owner; // an index into the GenericParam table - public int Constraint; // a TypeDefOrRef (§24.2.6) coded index + public int Constraint; // a TypeDefOrRef (Sec 24.2.6) coded index public GenericParamConstraint(PEFile file, int rows) { super(file, ID, rows); diff --git a/src/partest/scala/tools/partest/PartestTask.scala b/src/partest/scala/tools/partest/PartestTask.scala index f1b3ea496d..1a75621d4d 100644 --- a/src/partest/scala/tools/partest/PartestTask.scala +++ b/src/partest/scala/tools/partest/PartestTask.scala @@ -19,7 +19,6 @@ import util.PathResolver import scala.tools.ant.sabbus.CompilationPathProperty import java.io.File -import java.net.URLClassLoader import java.lang.reflect.Method import org.apache.tools.ant.Task diff --git a/src/partest/scala/tools/partest/ReplTest.scala b/src/partest/scala/tools/partest/ReplTest.scala index 2f6bcea78b..b31c43ba6f 100644 --- a/src/partest/scala/tools/partest/ReplTest.scala +++ b/src/partest/scala/tools/partest/ReplTest.scala @@ -5,6 +5,7 @@ package scala.tools.partest +import scala.tools.nsc.Settings import scala.tools.nsc.interpreter.ILoop import java.lang.reflect.{ Method => JMethod, Field => JField } @@ -13,7 +14,8 @@ import java.lang.reflect.{ Method => JMethod, Field => JField } */ abstract class ReplTest extends App { def code: String - def eval() = (ILoop run code).lines drop 1 + def settings: Settings = new Settings // override for custom settings + def eval() = ILoop.runForTranscript(code, settings).lines drop 1 def show() = eval() foreach println show() diff --git a/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala b/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala index 4182cc78b8..02edf0fc31 100644 --- a/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala +++ b/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala @@ -166,6 +166,7 @@ class ConsoleFileManager extends FileManager { var latestCompFile: File = _ var latestPartestFile: File = _ var latestFjbgFile: File = _ + def latestScalapFile: File = (latestLibFile.parent / "scalap.jar").jfile var testClassesDir: Directory = _ // initialize above fields findLatest() diff --git a/src/partest/scala/tools/partest/nest/PathSettings.scala b/src/partest/scala/tools/partest/nest/PathSettings.scala index b02417a50c..7461b45fee 100644 --- a/src/partest/scala/tools/partest/nest/PathSettings.scala +++ b/src/partest/scala/tools/partest/nest/PathSettings.scala @@ -10,7 +10,6 @@ import scala.tools.nsc.util.ClassPath import scala.tools.nsc.io import io.{ Path, File, Directory } import RunnerUtils._ -import java.net.URLClassLoader object PathSettings { import PartestDefaults.{ testRootDir, srcDirName } diff --git a/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala b/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala index b0aa56f9ff..f39debf31d 100644 --- a/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala +++ b/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala @@ -48,9 +48,9 @@ class ReflectiveRunner { new ConsoleFileManager import fileManager. - { latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile } + { latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile, latestScalapFile } val files = - Array(latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile) map (x => io.File(x)) + Array(latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile, latestScalapFile) map (x => io.File(x)) val sepUrls = files map (_.toURL) val sepLoader = new URLClassLoader(sepUrls, null) diff --git a/src/partest/scala/tools/partest/nest/Worker.scala b/src/partest/scala/tools/partest/nest/Worker.scala index afbdfdba83..301fe5e32b 100644 --- a/src/partest/scala/tools/partest/nest/Worker.scala +++ b/src/partest/scala/tools/partest/nest/Worker.scala @@ -9,7 +9,7 @@ package scala.tools.partest package nest import java.io._ -import java.net.{ URLClassLoader, URL } +import java.net.URL import java.util.{ Timer, TimerTask } import scala.util.Properties.{ isWin } @@ -285,25 +285,7 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor */ def runCommand(command: String, outFile: File): Boolean = { NestUI.verbose("running command:\n"+command) - - // This is laboriously avoiding #> since it swallows exit failure code. - // To be revisited. XXX. - val out = new StringBuilder - val err = new StringBuilder - val errorLogger = ProcessLogger(x => err append (x + "\n")) - val pio = BasicIO( - false, - x => out append (x + "\n"), - Some(errorLogger) - ) - val process = Process(command) run pio - val code = process.exitValue() - SFile(outFile) writeAll out.toString - - (code == 0) || { - SFile(outFile).appendAll(command + " failed with code: " + code + "\n", err.toString) - false - } + (command #> outFile !) == 0 } def execTest(outDir: File, logFile: File, classpathPrefix: String = ""): Boolean = { @@ -842,35 +824,31 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor case "scalap" => runInContext(file, (logFile: File, outDir: File) => { - val sourceDir = file.getParentFile - val sourceDirName = sourceDir.getName - - // 1. Find file with result text - val results = sourceDir.listFiles(new FilenameFilter { - def accept(dir: File, name: String) = name == "result.test" - }) + val sourceDir = Directory(if (file.isFile) file.getParent else file) + val sources = sourceDir.files filter (_ hasExtension "scala") map (_.jfile) toList + val results = sourceDir.files filter (_.name == "result.test") map (_.jfile) toList - if (results.length != 1) { - NestUI.verbose("Result file not found in directory " + sourceDirName + " \n") + if (sources.length != 1 || results.length != 1) { + NestUI.warning("Misconfigured scalap test directory: " + sourceDir + " \n") false } else { - val resFile = results(0) + val resFile = results.head // 2. Compile source file - if (!compileMgr.shouldCompile(outDir, List(file), kind, logFile)) { - NestUI.verbose("compilerMgr failed to compile %s to %s".format(file, outDir)) + if (!compileMgr.shouldCompile(outDir, sources, kind, logFile)) { + NestUI.normal("compilerMgr failed to compile %s to %s".format(sources mkString ", ", outDir)) false } else { // 3. Decompile file and compare results - val isPackageObject = sourceDir.getName.startsWith("package") - val className = sourceDirName.capitalize + (if (!isPackageObject) "" else ".package") - val url = outDir.toURI.toURL - val loader = new URLClassLoader(Array(url), getClass.getClassLoader) - val clazz = loader.loadClass(className) + val isPackageObject = sourceDir.name startsWith "package" + val className = sourceDir.name.capitalize + (if (!isPackageObject) "" else ".package") + val url = outDir.toURI.toURL + val loader = ScalaClassLoader.fromURLs(List(url), this.getClass.getClassLoader) + val clazz = loader.loadClass(className) val byteCode = ByteCode.forClass(clazz) - val result = scala.tools.scalap.Main.decompileScala(byteCode.bytes, isPackageObject) + val result = scala.tools.scalap.Main.decompileScala(byteCode.bytes, isPackageObject) SFile(logFile) writeAll result diffCheck(compareFiles(logFile, resFile)) @@ -951,10 +929,12 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor wr.flush() swr.flush() NestUI.normal(swr.toString) - if (isFail && (fileManager.showDiff || isPartestDebug) && diff != "") - NestUI.normal(diff) - if (isFail && fileManager.showLog) - showLog(logFile) + if (isFail) { + if ((fileManager.showDiff || isPartestDebug) && diff != "") + NestUI.normal(diff) + else if (fileManager.showLog) + showLog(logFile) + } } cleanup() } diff --git a/src/scalap/scala/tools/scalap/Decode.scala b/src/scalap/scala/tools/scalap/Decode.scala index c8bb58c81e..816041720f 100644 --- a/src/scalap/scala/tools/scalap/Decode.scala +++ b/src/scalap/scala/tools/scalap/Decode.scala @@ -33,7 +33,7 @@ object Decode { */ def scalaSigBytes(name: String): Option[Array[Byte]] = scalaSigBytes(name, getSystemLoader()) def scalaSigBytes(name: String, classLoader: ScalaClassLoader): Option[Array[Byte]] = { - val bytes = classLoader.findBytesForClassName(name) + val bytes = classLoader.classBytes(name) val reader = new ByteArrayReader(bytes) val cf = new Classfile(reader) cf.scalaSigAttribute map (_.data) @@ -43,7 +43,7 @@ object Decode { */ def scalaSigAnnotationBytes(name: String): Option[Array[Byte]] = scalaSigAnnotationBytes(name, getSystemLoader()) def scalaSigAnnotationBytes(name: String, classLoader: ScalaClassLoader): Option[Array[Byte]] = { - val bytes = classLoader.findBytesForClassName(name) + val bytes = classLoader.classBytes(name) val byteCode = ByteCode(bytes) val classFile = ClassFileParser.parse(byteCode) import classFile._ diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala index 2a2716ba20..9ddb521a10 100644 --- a/src/scalap/scala/tools/scalap/Main.scala +++ b/src/scalap/scala/tools/scalap/Main.scala @@ -5,50 +5,33 @@ ** */ - package scala.tools.scalap -import java.io.{PrintStream, OutputStreamWriter, ByteArrayOutputStream} +import java.io.{ PrintStream, OutputStreamWriter, ByteArrayOutputStream } import scalax.rules.scalasig._ import tools.nsc.util.{ ClassPath, JavaClassPath } import tools.util.PathResolver import ClassPath.DefaultJavaContext -import tools.nsc.io.{PlainFile, AbstractFile} +import tools.nsc.io.{ PlainFile, AbstractFile } /**The main object used to execute scalap on the command-line. * * @author Matthias Zenger, Stephane Micheloud, Burak Emir, Ilya Sergey */ -object Main { - val SCALA_SIG = "ScalaSig" +class Main { + val SCALA_SIG = "ScalaSig" val SCALA_SIG_ANNOTATION = "Lscala/reflect/ScalaSignature;" - val BYTES_VALUE = "bytes" + val BYTES_VALUE = "bytes" - val versionMsg = "Scala classfile decoder " + - Properties.versionString + " -- " + - Properties.copyrightString + "\n" + val versionMsg = "Scala classfile decoder %s -- %s\n".format(Properties.versionString, Properties.copyrightString) /**Verbose program run? */ var verbose = false var printPrivates = false - /**Prints usage information for scalap. - */ - def usage { - Console.println("usage: scalap {<option>} <name>") - Console.println("where <name> is fully-qualified class name or <package_name>.package for package objects") - Console.println("and <option> is") - Console.println(" -private print private definitions") - Console.println(" -verbose print out additional information") - Console.println(" -version print out the version number of scalap") - Console.println(" -help display this usage message") - Console.println(" -classpath <path> specify where to find user class files") - Console.println(" -cp <path> specify where to find user class files") - } - def isScalaFile(bytes: Array[Byte]): Boolean = { - val byteCode = ByteCode(bytes) + val byteCode = ByteCode(bytes) val classFile = ClassFileParser.parse(byteCode) classFile.attribute("ScalaSig").isDefined } @@ -69,11 +52,12 @@ object Main { def isPackageObjectFile(s: String) = s != null && (s.endsWith(".package") || s == "package") def parseScalaSignature(scalaSig: ScalaSig, isPackageObject: Boolean) = { - val baos = new ByteArrayOutputStream + val baos = new ByteArrayOutputStream val stream = new PrintStream(baos) - val syms = scalaSig.topLevelClasses ::: scalaSig.topLevelObjects + val syms = scalaSig.topLevelClasses ++ scalaSig.topLevelObjects + syms.head.parent match { - //Partial match + // Partial match case Some(p) if (p.name != "<empty>") => { val path = p.path if (!isPackageObject) { @@ -93,9 +77,7 @@ object Main { } // Print classes val printer = new ScalaSigPrinter(stream, printPrivates) - for (c <- syms) { - printer.printSymbol(c) - } + syms foreach (printer printSymbol _) baos.toString } @@ -109,12 +91,8 @@ object Main { } } - /**Executes scalap with the given arguments and classpath for the - * class denoted by <code>classname</code>. - * - * @param args... - * @param path... - * @param classname... + /** Executes scalap with the given arguments and classpath for the + * class denoted by `classname`. */ def process(args: Arguments, path: ClassPath[AbstractFile])(classname: String): Unit = { // find the classfile @@ -139,136 +117,9 @@ object Main { } // if the class corresponds to the artificial class scala.Any. // (see member list in class scala.tool.nsc.symtab.Definitions) - } else if (classname == "scala.Any") { - Console.println("package scala") - Console.println("class Any {") - Console.println(" final def ==(scala.Any): scala.Boolean") - Console.println(" final def !=(scala.Any): Boolean") - Console.println(" def equals(scala.Any): scala.Boolean") - Console.println(" def hashCode(): scala.Int") - Console.println(" def toString(): java.lang.String") - Console.println(" final def isInstanceOf[a]: scala.Boolean") - Console.println(" final def asInstanceOf[a]: a") - Console.println("}") - // if the class corresponds to the artificial class scala.AnyRef. - } else if (classname == "scala.AnyRef") { - Console.println("package scala") - Console.println("class AnyRef extends Any {") - Console.println(" def equals(scala.Any): scala.Boolean") - Console.println(" def hashCode(): scala.Int") - Console.println(" def toString(): java.lang.String") - Console.println("}") - // if the class corresponds to the artificial class scala.AnyVal. - } else if (classname == "scala.AnyVal") { - Console.println("package scala") - Console.println("sealed class AnyVal extends Any") - // if the class corresponds to the artificial class scala.Boolean. - } else if (classname == "scala.Boolean") { - Console.println("package scala") - Console.println("sealed abstract class Boolean extends AnyVal {") - Console.println(" def &&(p: => scala.Boolean): scala.Boolean // boolean and") - Console.println(" def ||(p: => scala.Boolean): scala.Boolean // boolean or") - Console.println(" def & (x: scala.Boolean): scala.Boolean // boolean strict and") - Console.println(" def | (x: scala.Boolean): scala.Boolean // boolean stric or") - Console.println(" def ==(x: scala.Boolean): scala.Boolean // boolean equality") - Console.println(" def !=(x: scala.Boolean): scala.Boolean // boolean inequality") - Console.println(" def !: scala.Boolean // boolean negation") - Console.println("}") - // if the class corresponds to the artificial class scala.Int. - } else if (classname == "scala.Int") { - Console.println("package scala") - Console.println("sealed abstract class Int extends AnyVal {") - Console.println(" def ==(that: scala.Double): scala.Boolean") - Console.println(" def ==(that: scala.Float): scala.Boolean") - Console.println(" def ==(that: scala.Long): scala.Boolean") - Console.println(" def ==(that: scala.Int): scala.Boolean") - Console.println(" def ==(that: scala.Short): scala.Boolean") - Console.println(" def ==(that: scala.Byte): scala.Boolean") - Console.println(" def ==(that: scala.Char): scala.Boolean") - Console.println(" /* analogous for !=, <, >, <=, >= */") - Console.println - Console.println(" def + (that: scala.Double): scala.Double // double addition") - Console.println(" def + (that: scala.Float): scala.Float // float addition") - Console.println(" def + (that: scala.Long): scala.Long // long addition") - Console.println(" def + (that: scala.Int): scala.Int // int addition") - Console.println(" def + (that: scala.Short): scala.Int // int addition") - Console.println(" def + (that: scala.Byte): scala.Int // int addition") - Console.println(" def + (that: scala.Char): scala.Int // int addition") - Console.println(" /* analogous for -, *, /, % */") - Console.println - Console.println(" def & (that: scala.Long): scala.Long // long bitwise and") - Console.println(" def & (that: scala.Int): scala.Int // int bitwise and") - Console.println(" def & (that: scala.Short): scala.Int // int bitwise and") - Console.println(" def & (that: scala.Byte): scala.Int // int bitwise and") - Console.println(" def & (that: scala.Char): scala.Int // int bitwise and") - Console.println(" /* analogous for |, ^ */") - Console.println - Console.println(" def <<(cnt: scala.Int): scala.Int // int left shift") - Console.println(" def <<(cnt: scala.Long): scala.Int // long left shift") - Console.println(" /* analogous for >>, >>> */") - Console.println - Console.println(" def + : scala.Int // int identity") - Console.println(" def - : scala.Int // int negation") - Console.println(" def ~ : scala.Int // int bitwise negation") - Console.println - Console.println(" def toByte: scala.Byte // convert to Byte") - Console.println(" def toShort: scala.Short // convert to Short") - Console.println(" def toChar: scala.Char // convert to Char") - Console.println(" def toInt: scala.Int // convert to Int") - Console.println(" def toLong: scala.Long // convert to Long") - Console.println(" def toFloat: scala.Float // convert to Float") - Console.println(" def toDouble: scala.Double // convert to Double") - Console.println("}") - // if the class corresponds to the artificial class scala.Nothing. - } else if (classname == "scala.Nothing") { - Console.println("package scala") - Console.println("sealed abstract class Nothing") - // if the class corresponds to the artificial class scala.Null. - } else if (classname == "scala.Null") { - Console.println("package scala") - Console.println("sealed abstract class Null") - } else - Console.println("class/object " + classname + " not found.") - } - - /**The main method of this object. - */ - def main(args: Array[String]) { - // print usage information if there is no command-line argument - if (args.length == 0) - usage - // otherwise parse the arguments... - else { - val arguments = Arguments.Parser('-') - .withOption("-private") - .withOption("-verbose") - .withOption("-version") - .withOption("-help") - .withOptionalArg("-classpath") - .withOptionalArg("-cp") - .parse(args); - if (arguments contains "-version") - Console.println(versionMsg) - if (arguments contains "-help") - usage - verbose = arguments contains "-verbose" - printPrivates = arguments contains "-private" - // construct a custom class path - def cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _) - val path = cparg match { - case Some(cpstring) => - new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cpstring), DefaultJavaContext) - - case None => - PathResolver.fromPathString("") - } - // print the classpath if output is verbose - if (verbose) - Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path) - - // process all given classes - arguments.getOthers.foreach(process(arguments, path)) } + else + Console.println("class/object " + classname + " not found.") } object EmptyClasspath extends ClassPath[AbstractFile] { @@ -284,3 +135,55 @@ object Main { val sourcepaths: List[AbstractFile] = Nil } } + +object Main extends Main { + /** Prints usage information for scalap. */ + def usage() { + Console println """ + |Usage: scalap {<option>} <name> + |where <name> is fully-qualified class name or <package_name>.package for package objects + |and <option> is + | -private print private definitions + | -verbose print out additional information + | -version print out the version number of scalap + | -help display this usage message + | -classpath <path> specify where to find user class files + | -cp <path> specify where to find user class files + """.stripMargin.trim + } + + def main(args: Array[String]) { + // print usage information if there is no command-line argument + if (args.isEmpty) + return usage() + + val arguments = Arguments.Parser('-') + .withOption("-private") + .withOption("-verbose") + .withOption("-version") + .withOption("-help") + .withOptionalArg("-classpath") + .withOptionalArg("-cp") + .parse(args); + + if (arguments contains "-version") + Console.println(versionMsg) + if (arguments contains "-help") + usage() + + verbose = arguments contains "-verbose" + printPrivates = arguments contains "-private" + // construct a custom class path + val cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _) + val path = cparg match { + case Some(cp) => new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cp), DefaultJavaContext) + case _ => PathResolver.fromPathString("") + } + // print the classpath if output is verbose + if (verbose) + Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path) + + // process all given classes + arguments.getOthers foreach process(arguments, path) + } +} diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala index 170a9a15a3..995c629b5d 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala @@ -253,9 +253,11 @@ object ScalaSigEntryParsers extends RulesWithState with MemoisableRules { 18 -~ classSymRef ~ (typeRef*) ^~^ RefinedType, 19 -~ symbolRef ~ (typeRef*) ^~^ ClassInfoType, 20 -~ typeRef ~ (symbolRef*) ^~^ MethodType, - 21 -~ typeRef ~ (refTo(typeSymbol)+) ^~^ PolyType, // TODO: make future safe for past by doing the same transformation as in the full unpickler in case we're reading pre-2.9 classfiles + 21 -~ typeRef ~ (refTo(typeSymbol)+) ^~^ PolyType, + // TODO: make future safe for past by doing the same transformation as in the + // full unpickler in case we're reading pre-2.9 classfiles 21 -~ typeRef ^^ NullaryMethodType, - 22 -~ typeRef ~ (symbolRef*) ^~^ ImplicitMethodType, + 22 -~ typeRef ~ (symbolRef*) ^~^ MethodType, 42 -~ typeRef ~ (attribTreeRef*) ^~^ AnnotatedType, 51 -~ typeRef ~ symbolRef ~ (attribTreeRef*) ^~~^ AnnotatedWithSelfType, 47 -~ typeLevel ~ typeIndex ^~^ DeBruijnIndexType, diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala index acaf64df2a..93c1c7a394 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala @@ -205,16 +205,17 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { case ms: MethodSymbol => ms.name + " : " + toString(ms.infoType)(TypeFlags(true)) case _ => "^___^" }) + val implicitWord = mt.paramSymbols.headOption match { + case Some(p) if p.isImplicit => "implicit " + case _ => "" + } // Print parameter clauses - print(paramEntries.mkString( - "(" + (mt match {case _: ImplicitMethodType => "implicit "; case _ => ""}) - , ", ", ")")) + print(paramEntries.mkString("(" + implicitWord, ", ", ")")) // Print result type mt.resultType match { case mt: MethodType => printMethodType(mt, printResult)({}) - case imt: ImplicitMethodType => printMethodType(imt, printResult)({}) case x => if (printResult) { print(" : "); printType(x) @@ -225,7 +226,6 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { t match { case NullaryMethodType(resType) => if (printResult) { print(" : "); printType(resType) } case mt@MethodType(resType, paramSymbols) => _pmt(mt) - case mt@ImplicitMethodType(resType, paramSymbols) => _pmt(mt) case pt@PolyType(mt, typeParams) => { print(typeParamString(typeParams)) printMethodType(mt, printResult)({}) @@ -373,7 +373,6 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { case ClassInfoTypeWithCons(symbol, typeRefs, cons) => sep + typeRefs.map(toString). mkString(cons + " extends ", " with ", "") - case ImplicitMethodType(resultType, _) => toString(resultType, sep) case MethodType(resultType, _) => toString(resultType, sep) case NullaryMethodType(resultType) => toString(resultType, sep) diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala index 3658cb1c89..543ddbe186 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala @@ -20,7 +20,6 @@ case class MethodType(resultType : Type, paramSymbols : Seq[Symbol]) extends Typ case class NullaryMethodType(resultType : Type) extends Type case class PolyType(typeRef : Type, symbols : Seq[TypeSymbol]) extends Type case class PolyTypeWithCons(typeRef : Type, symbols : Seq[TypeSymbol], cons: String) extends Type -case class ImplicitMethodType(resultType : Type, paramSymbols : Seq[Symbol]) extends Type case class AnnotatedType(typeRef : Type, attribTreeRefs : List[Int]) extends Type case class AnnotatedWithSelfType(typeRef : Type, symbol : Symbol, attribTreeRefs : List[Int]) extends Type case class DeBruijnIndexType(typeLevel : Int, typeIndex : Int) extends Type diff --git a/src/swing/scala/swing/ComboBox.scala b/src/swing/scala/swing/ComboBox.scala index 69cfa6988f..75f981064b 100644 --- a/src/swing/scala/swing/ComboBox.scala +++ b/src/swing/scala/swing/ComboBox.scala @@ -122,7 +122,7 @@ object ComboBox { def newConstantModel[A](items: Seq[A]): ComboBoxModel = { new AbstractListModel with ComboBoxModel { - private var selected = items(0) + private var selected: A = if (items.isEmpty) null.asInstanceOf[A] else items(0) def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef] def setSelectedItem(a: Any) { if ((selected != null && selected != a) || diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala index 3cbe2dbfd1..b7a93ef448 100644 --- a/src/swing/scala/swing/Component.scala +++ b/src/swing/scala/swing/Component.scala @@ -103,7 +103,7 @@ abstract class Component extends UIElement { def tooltip_=(t: String) = peer.setToolTipText(t) def inputVerifier: Component => Boolean = { a => - peer.getInputVerifier.verify(a.peer) + Option(peer.getInputVerifier) forall (_ verify a.peer) } def inputVerifier_=(v: Component => Boolean) { peer.setInputVerifier(new javax.swing.InputVerifier { diff --git a/src/swing/scala/swing/TextField.scala b/src/swing/scala/swing/TextField.scala index d2a9f150a2..f04e122fb9 100644 --- a/src/swing/scala/swing/TextField.scala +++ b/src/swing/scala/swing/TextField.scala @@ -60,15 +60,15 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom peer.removeActionListener(actionListener) } - def verifier: String => Boolean = s => peer.getInputVerifier.verify(peer) + def verifier: String => Boolean = s => Option(peer.getInputVerifier) forall (_ verify peer) def verifier_=(v: String => Boolean) { peer.setInputVerifier(new InputVerifier { - private val old = peer.getInputVerifier + private val old = Option(peer.getInputVerifier) def verify(c: JComponent) = v(text) - override def shouldYieldFocus(c: JComponent) = old.shouldYieldFocus(c) + override def shouldYieldFocus(c: JComponent) = old forall (_ shouldYieldFocus c) }) } - def shouldYieldFocus: String=>Boolean = s => peer.getInputVerifier.shouldYieldFocus(peer) + def shouldYieldFocus: String => Boolean = s => Option(peer.getInputVerifier) forall (_ shouldYieldFocus peer) def shouldYieldFocus_=(y: String=>Boolean) { peer.setInputVerifier(new InputVerifier { private val old = peer.getInputVerifier |