summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.xml5
-rw-r--r--lib/msil.jar.desired.sha12
-rw-r--r--project/build/SVN.scala2
-rw-r--r--src/build/genprod.scala13
-rw-r--r--src/build/pack.xml78
-rw-r--r--src/compiler/scala/tools/ant/Scaladoc.scala9
-rw-r--r--src/compiler/scala/tools/ant/templates/tool-unix.tmpl2
-rw-r--r--src/compiler/scala/tools/ant/templates/tool-windows.tmpl12
-rw-r--r--src/compiler/scala/tools/cmd/gen/AnyVals.scala404
-rw-r--r--src/compiler/scala/tools/cmd/gen/Codegen.scala8
-rw-r--r--src/compiler/scala/tools/nsc/CompileClient.scala26
-rw-r--r--src/compiler/scala/tools/nsc/CompileServer.scala48
-rw-r--r--src/compiler/scala/tools/nsc/CompileSocket.scala2
-rw-r--r--src/compiler/scala/tools/nsc/CompilerCommand.scala57
-rw-r--r--src/compiler/scala/tools/nsc/GenericRunnerCommand.scala10
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala91
-rw-r--r--src/compiler/scala/tools/nsc/MainGenericRunner.scala14
-rw-r--r--src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala30
-rw-r--r--src/compiler/scala/tools/nsc/ScalaDoc.scala116
-rwxr-xr-xsrc/compiler/scala/tools/nsc/ast/DocComments.scala195
-rw-r--r--src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala38
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala7
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocFactory.scala112
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocParser.scala74
-rw-r--r--src/compiler/scala/tools/nsc/doc/Settings.scala18
-rw-r--r--src/compiler/scala/tools/nsc/doc/SourcelessComments.scala249
-rw-r--r--src/compiler/scala/tools/nsc/doc/Uncompilable.scala48
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala4
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Template.scala350
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.pngbin0 -> 6232 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.pngbin0 -> 6220 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class.pngbin516 -> 3357 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.pngbin3183 -> 7495 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css45
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js25
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object.pngbin518 -> 3356 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.pngbin3318 -> 7619 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/package.pngbin488 -> 3335 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.pngbin3183 -> 7312 bytes
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css8
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css289
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js77
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.pngbin494 -> 3374 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.pngbin3088 -> 7378 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai3220
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/Entity.scala15
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala53
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala70
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala27
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Global.scala75
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Picklers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala41
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ByteCode.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/CommandLine.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala3
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Dossiers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ILoop.scala424
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/IMain.scala280
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Imports.scala194
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala7
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala4
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/JLineReader.scala1
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala82
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala24
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Pasted.scala102
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Phased.scala28
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Power.scala210
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala42
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala45
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplVals.scala20
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/package.scala41
-rw-r--r--src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala39
-rw-r--r--src/compiler/scala/tools/nsc/io/File.scala4
-rw-r--r--src/compiler/scala/tools/nsc/io/Jar.scala41
-rw-r--r--src/compiler/scala/tools/nsc/io/Sources.scala26
-rw-r--r--src/compiler/scala/tools/nsc/javac/JavaScanners.scala4
-rw-r--r--src/compiler/scala/tools/nsc/plugins/Plugins.scala2
-rw-r--r--src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala20
-rw-r--r--src/compiler/scala/tools/nsc/settings/AbsSettings.scala11
-rw-r--r--src/compiler/scala/tools/nsc/settings/AestheticSettings.scala2
-rw-r--r--src/compiler/scala/tools/nsc/settings/FscSettings.scala37
-rw-r--r--src/compiler/scala/tools/nsc/settings/MutableSettings.scala11
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala15
-rw-r--r--src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala1
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala11
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala10
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala15
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala30
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala31
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala11
-rw-r--r--src/compiler/scala/tools/nsc/transform/LiftCode.scala3
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala19
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala9
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala28
-rw-r--r--src/compiler/scala/tools/nsc/util/ClassPath.scala12
-rw-r--r--src/compiler/scala/tools/nsc/util/InterruptReq.scala6
-rw-r--r--src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala21
-rw-r--r--src/compiler/scala/tools/nsc/util/ShowPickled.scala2
-rw-r--r--src/compiler/scala/tools/nsc/util/Tracer.scala43
-rw-r--r--src/compiler/scala/tools/util/Javap.scala2
-rw-r--r--src/library-aux/README3
-rw-r--r--src/library-aux/scala/Any.scala105
-rw-r--r--src/library-aux/scala/AnyRef.scala129
-rw-r--r--src/library-aux/scala/Nothing.scala23
-rw-r--r--src/library-aux/scala/Null.scala17
-rwxr-xr-xsrc/library/scala/AnyVal.scala17
-rwxr-xr-xsrc/library/scala/Boolean.scala33
-rw-r--r--src/library/scala/Byte.scala43
-rw-r--r--src/library/scala/Char.scala43
-rw-r--r--src/library/scala/Double.scala48
-rw-r--r--src/library/scala/Dynamic.scala9
-rw-r--r--src/library/scala/Equals.scala8
-rw-r--r--src/library/scala/Float.scala48
-rw-r--r--src/library/scala/Function0.scala2
-rw-r--r--src/library/scala/Function1.scala1
-rw-r--r--src/library/scala/Int.scala43
-rw-r--r--src/library/scala/Long.scala43
-rw-r--r--src/library/scala/Option.scala2
-rw-r--r--src/library/scala/Predef.scala4
-rw-r--r--src/library/scala/Product.scala36
-rw-r--r--src/library/scala/Short.scala43
-rw-r--r--src/library/scala/Tuple2.scala2
-rw-r--r--src/library/scala/Tuple3.scala2
-rwxr-xr-xsrc/library/scala/Unit.scala33
-rw-r--r--src/library/scala/collection/Iterator.scala1
-rw-r--r--src/library/scala/collection/Map.scala2
-rw-r--r--src/library/scala/collection/Parallel.scala10
-rw-r--r--src/library/scala/collection/SetProxyLike.scala4
-rw-r--r--src/library/scala/collection/SortedSet.scala3
-rw-r--r--src/library/scala/collection/TraversableOnce.scala8
-rw-r--r--src/library/scala/collection/TraversableViewLike.scala8
-rw-r--r--src/library/scala/collection/generic/Addable.scala8
-rw-r--r--src/library/scala/collection/generic/ClassManifestTraversableFactory.scala8
-rw-r--r--src/library/scala/collection/generic/GenericClassManifestCompanion.scala8
-rw-r--r--src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala6
-rw-r--r--src/library/scala/collection/generic/GenericCompanion.scala2
-rw-r--r--src/library/scala/collection/generic/GenericParCompanion.scala5
-rw-r--r--src/library/scala/collection/generic/ParFactory.scala4
-rw-r--r--src/library/scala/collection/generic/ParMapFactory.scala9
-rw-r--r--src/library/scala/collection/generic/Subtractable.scala8
-rw-r--r--src/library/scala/collection/immutable/IntMap.scala5
-rw-r--r--src/library/scala/collection/immutable/List.scala2
-rw-r--r--src/library/scala/collection/immutable/LongMap.scala8
-rw-r--r--src/library/scala/collection/immutable/Set.scala7
-rw-r--r--src/library/scala/collection/immutable/StringLike.scala15
-rw-r--r--src/library/scala/collection/mutable/ArrayBuffer.scala2
-rw-r--r--src/library/scala/collection/mutable/ArraySeq.scala2
-rw-r--r--src/library/scala/collection/mutable/BitSet.scala2
-rw-r--r--src/library/scala/collection/mutable/DoubleLinkedList.scala22
-rw-r--r--src/library/scala/collection/mutable/DoubleLinkedListLike.scala13
-rw-r--r--src/library/scala/collection/mutable/FlatHashTable.scala7
-rw-r--r--src/library/scala/collection/mutable/HashMap.scala2
-rw-r--r--src/library/scala/collection/mutable/HashSet.scala5
-rw-r--r--src/library/scala/collection/mutable/IndexedSeqView.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedHashMap.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedHashSet.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedList.scala5
-rw-r--r--src/library/scala/collection/mutable/LinkedListLike.scala15
-rw-r--r--src/library/scala/collection/mutable/ListBuffer.scala2
-rw-r--r--src/library/scala/collection/mutable/ListMap.scala2
-rw-r--r--src/library/scala/collection/mutable/MutableList.scala3
-rw-r--r--src/library/scala/collection/mutable/Set.scala5
-rw-r--r--src/library/scala/collection/mutable/StringBuilder.scala5
-rw-r--r--src/library/scala/collection/mutable/UnrolledBuffer.scala11
-rw-r--r--src/library/scala/collection/mutable/WeakHashMap.scala2
-rw-r--r--src/library/scala/collection/parallel/ParIterable.scala19
-rw-r--r--src/library/scala/collection/parallel/immutable/ParHashMap.scala2
-rw-r--r--src/library/scala/collection/parallel/immutable/ParHashSet.scala2
-rw-r--r--src/library/scala/collection/parallel/immutable/ParIterable.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParArray.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala11
-rw-r--r--src/library/scala/collection/parallel/mutable/ParHashMap.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParHashSet.scala27
-rw-r--r--src/library/scala/collection/parallel/mutable/ParIterable.scala2
-rw-r--r--src/library/scala/io/Position.scala113
-rw-r--r--src/library/scala/io/Source.scala26
-rw-r--r--src/library/scala/math/Ordering.scala1
-rw-r--r--src/library/scala/reflect/ClassManifest.scala14
-rw-r--r--src/library/scala/reflect/Manifest.scala54
-rwxr-xr-xsrc/library/scala/reflect/NameTransformer.scala15
-rw-r--r--src/library/scala/reflect/Type.scala13
-rwxr-xr-xsrc/library/scala/reflect/generic/PickleFormat.scala2
-rwxr-xr-xsrc/library/scala/reflect/generic/Symbols.scala4
-rw-r--r--src/library/scala/runtime/RichUnit.scala22
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala30
-rw-r--r--src/library/scala/sys/BooleanProp.scala2
-rw-r--r--src/library/scala/sys/Prop.scala6
-rw-r--r--src/library/scala/sys/PropImpl.scala2
-rw-r--r--src/library/scala/sys/SystemProperties.scala16
-rw-r--r--src/library/scala/util/control/NoStackTrace.scala2
-rw-r--r--src/library/scala/util/logging/Logged.scala33
-rw-r--r--src/library/scala/xml/Attribute.scala10
-rw-r--r--src/library/scala/xml/Elem.scala3
-rw-r--r--src/library/scala/xml/MetaData.scala7
-rw-r--r--src/library/scala/xml/include/sax/EncodingHeuristics.scala18
-rwxr-xr-xsrc/library/scala/xml/pull/XMLEventReader.scala3
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/Attribute.java197
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java45
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java49
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java9
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/PEFile.java32
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/PEType.java16
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java5
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/Type.java12
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala7
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala36
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala22
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java23
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java2
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/util/Table.java4
-rw-r--r--src/partest/scala/tools/partest/PartestTask.scala1
-rw-r--r--src/partest/scala/tools/partest/ReplTest.scala4
-rw-r--r--src/partest/scala/tools/partest/nest/ConsoleFileManager.scala1
-rw-r--r--src/partest/scala/tools/partest/nest/PathSettings.scala1
-rw-r--r--src/partest/scala/tools/partest/nest/ReflectiveRunner.scala4
-rw-r--r--src/partest/scala/tools/partest/nest/Worker.scala64
-rw-r--r--src/scalap/scala/tools/scalap/Decode.scala4
-rw-r--r--src/scalap/scala/tools/scalap/Main.scala233
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala6
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala11
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala1
-rw-r--r--src/swing/scala/swing/ComboBox.scala2
-rw-r--r--src/swing/scala/swing/Component.scala2
-rw-r--r--src/swing/scala/swing/TextField.scala8
-rw-r--r--test/disabled/presentation/simple-tests/SimpleInteractiveTest.scala (renamed from test/files/presentation/simple-tests/SimpleInteractiveTest.scala)0
-rw-r--r--test/disabled/presentation/simple-tests/src/Tester.scala (renamed from test/files/presentation/simple-tests/src/Tester.scala)0
-rw-r--r--test/disabled/run/bug4279.scala (renamed from test/files/run/bug4279.scala)4
-rw-r--r--test/disabled/script/fact.args (renamed from test/files/script/fact.args)0
-rwxr-xr-xtest/disabled/script/fact.bat (renamed from test/files/script/fact.bat)0
-rw-r--r--test/disabled/script/fact.check (renamed from test/files/script/fact.check)0
-rwxr-xr-xtest/disabled/script/fact.scala (renamed from test/files/script/fact.scala)0
-rwxr-xr-xtest/disabled/script/second.bat (renamed from test/files/script/second.bat)0
-rw-r--r--test/disabled/script/second.check (renamed from test/files/script/second.check)0
-rwxr-xr-xtest/disabled/script/second.scala (renamed from test/files/script/second.scala)0
-rwxr-xr-xtest/disabled/script/t1015.bat (renamed from test/files/script/t1015.bat)0
-rwxr-xr-xtest/disabled/script/t1015.scala (renamed from test/files/script/t1015.scala)0
-rwxr-xr-xtest/disabled/script/t1017.bat (renamed from test/files/script/t1017.bat)0
-rwxr-xr-xtest/disabled/script/t1017.scala (renamed from test/files/script/t1017.scala)0
-rw-r--r--test/files/jvm/interpreter.check339
-rwxr-xr-xtest/files/jvm/mkLibNatives.bat3
-rw-r--r--test/files/jvm/natives-64.dllbin0 -> 37376 bytes
-rw-r--r--test/files/neg/annot-nonconst.check2
-rw-r--r--test/files/neg/bug3736.check5
-rw-r--r--test/files/neg/super-cast-or-test.check7
-rw-r--r--test/files/neg/super-cast-or-test.scala3
-rw-r--r--test/files/neg/t3399.check2
-rw-r--r--test/files/neg/t3507.check2
-rw-r--r--test/files/neg/t4431.check7
-rw-r--r--test/files/neg/t4431.scala16
-rw-r--r--test/files/pos/javaReadsSigs/fromjava.java77
-rw-r--r--test/files/presentation/find-trees.check2
-rw-r--r--test/files/run/bug3376.check13
-rw-r--r--test/files/run/bug4080.check1
-rw-r--r--test/files/run/bug4080.scala12
-rw-r--r--test/files/run/bug4285.check11
-rw-r--r--test/files/run/bug4387.scala12
-rw-r--r--test/files/run/constrained-types.check132
-rw-r--r--test/files/run/constrained-types.scala146
-rw-r--r--test/files/run/programmatic-main.scala2
-rw-r--r--test/files/run/repl-assign.check20
-rw-r--r--test/files/run/repl-assign.scala10
-rw-r--r--test/files/run/repl-paste-2.check56
-rw-r--r--test/files/run/repl-paste-2.scala17
-rw-r--r--test/files/run/repl-paste.check16
-rw-r--r--test/files/run/repl-transcript.check27
-rw-r--r--test/files/run/t3361.scala6
-rw-r--r--test/files/run/t4396.check5
-rw-r--r--test/files/run/t4396.scala35
-rw-r--r--test/files/run/treePrint.scala2
-rwxr-xr-xtest/partest3
-rw-r--r--test/scaladoc/resources/Trac3484.scala27
-rw-r--r--test/scaladoc/resources/Trac4180.scala4
-rw-r--r--test/scaladoc/resources/Trac4289.scala13
-rw-r--r--test/scaladoc/resources/Trac4325.scala5
-rw-r--r--test/scaladoc/resources/Trac4358.scala8
-rw-r--r--test/scaladoc/resources/Trac4372.scala5
-rw-r--r--test/scaladoc/resources/Trac4374.scala5
-rw-r--r--test/scaladoc/resources/Trac4409.scala14
-rw-r--r--test/scaladoc/resources/Trac4420.scala14
-rw-r--r--test/scaladoc/resources/Trac484.scala18
-rw-r--r--test/scaladoc/scala/html/HtmlFactoryTest.scala246
-rw-r--r--test/scaladoc/scala/model/CommentFactoryTest.scala43
-rwxr-xr-xtools/get-git-svn-rev29
-rwxr-xr-xtools/get-scala-revision3
289 files changed, 7031 insertions, 4603 deletions
diff --git a/build.xml b/build.xml
index c375c87df5..1943a36089 100644
--- a/build.xml
+++ b/build.xml
@@ -1408,6 +1408,7 @@ DOCUMENTATION
doctitle="Scala Standard Library"
docversion="${version.number}"
docsourceurl="https://lampsvn.epfl.ch/trac/scala/browser/scala/branches/2.9.x/src/€{FILE_PATH}.scala#L1"
+ docUncompilable="${src.dir}/library-aux"
sourcepath="${src.dir}"
classpathref="pack.classpath">
<src>
@@ -1418,16 +1419,12 @@ DOCUMENTATION
</src>
<include name="**/*.scala"/>
<exclude name="reflect/Code.scala"/>
- <exclude name="reflect/Manifest.scala"/>
<exclude name="reflect/Print.scala"/>
<exclude name="reflect/Symbol.scala"/>
<exclude name="reflect/Tree.scala"/>
<exclude name="reflect/Type.scala"/>
- <exclude name="reflect/TypedCode.scala"/>
- <exclude name="runtime/*Array.scala"/>
<exclude name="runtime/*$.scala"/>
<exclude name="runtime/ScalaRunTime.scala"/>
- <exclude name="runtime/StreamCons.scala"/>
<exclude name="runtime/StringAdd.scala"/>
<exclude name="scala/swing/test/**"/>
</scaladoc>
diff --git a/lib/msil.jar.desired.sha1 b/lib/msil.jar.desired.sha1
index 17f033a68e..6a95abf8e6 100644
--- a/lib/msil.jar.desired.sha1
+++ b/lib/msil.jar.desired.sha1
@@ -1 +1 @@
-23d40035aaa9efd273ae4ad7ca1ed30282946d68 ?msil.jar
+411bfee5f3b2b6bae5f6ac06f84b4f4624370492 ?msil.jar
diff --git a/project/build/SVN.scala b/project/build/SVN.scala
index 6a4f845cbc..6a64e727f9 100644
--- a/project/build/SVN.scala
+++ b/project/build/SVN.scala
@@ -6,7 +6,7 @@ import sbt._
*/
class SVN(root: Path) {
/** Location of tool which parses svn revision in git-svn repository. */
- val GitSvnRevTool = root / "tools" / "get-git-svn-rev"
+ val GitSvnRevTool = root / "tools" / "get-scala-revision"
val GitSvnRegex = """^Revision:\s*(\d+).*""".r
/**
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
new file mode 100644
index 0000000000..7229603ae5
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
Binary files differ
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
new file mode 100644
index 0000000000..b2f2935dc9
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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
index 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
Binary files differ
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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynba&#xA;/PLB5FuryZPMPpsVR5FjD2aSlP3nAujk022r1C5k6fka+ro1ZOl8kH+VVxocf5iarp3kyXn5TTTI&#xA;p9Sht3kmso9WaUKPRklHL4oVbcfap/kilmckwBl9V/YjH9W3J7DmE3OxV2KuxV2KuxV2KuxV2KpD&#xA;5s89eU/KUNvN5h1BLFbpylupWSV3KirFY4ld+K7ValBUeIycMcp8gxlIDmivLfmfQfMumDU9DvFv&#xA;bIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlA0UxkDyTTIJdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVU7m2t7q3ltrmJJ7eZTHNDIodHRhRlZWqCCOoOEGlU9P03TtNtEs9OtYbKzir6dtbx&#xA;rFEvIljxRAFFSSTiZE7lAFIjAl2KuxV2KuxV2KuxV2KuxV5v5w0LVrT8wW84pbT3emJ5euNNMVin&#xA;rXYuhMZY1SHhJX1PUorcSoI+OgpXIxyHDw9eJrkN78kX+Wumaw+s+ZfNepaY+ir5hktDaaZNw9dY&#xA;raAj1puBIV5WlPJCAykb45pChEG+FYDcnvZ7mO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuJAFT0xV5j58/Pryv5Zup9NtUbU9WhJR4YiPTRxx+3J0H7QIHxAj7NDXMrDpZT36NU8oD&#xA;zi6/5yR843N6k1rYQWtqtK2vL1OVDU1dkruNtszo9nCmg6gsv8tf85H6ZdziHXtPbTuVAs0LerGK&#xA;KftE8SOTUA2oOpbKcvZsgNt2cdSDzexW11b3VvHcW0qzQSqHilQhlZTuCCOoOa4iubkqmBXYq7FX&#xA;Yq7FXYq7FXYqwDzz+dXk/wApy/VZJDqGoUVvqlqVdgrgkFmrxX9k/ERUGormRi00ptcsgDzof85Q&#xA;aw5Xh5eh4j7ZNw9WHagCfD+OZo7Nvq0nU+TJfK3/ADkXoV/MINdtH0qR2/dzKfVgApQBn2ate/ED&#xA;7t68vZ047jdlHUA83rdtcwXMEdxbyLLBKoeORTUMrCoI+jNeRTkKmBXYq7FXYq7FXYq7FWHz/wB9&#xA;J/rH9ebAcmgrMKHYqn3l7/eaT/X/AIDMXPzbYck1yhm7FXYq7FXj3/OQv5mXflvSYtE0icR6pqis&#xA;ssqULwwinJga1RjWg271B2zL0uHiNlqyzp4J5D8ja95t1T6lpcXqSAc7i4kJEUSk/akeh6nt1Oba&#xA;WSOONycQRMjQe1Wf/OM5W3/0nXgtwR0ituSKfm0ilvuGY38q1yj9rZ+V82Geevyk17ypD9blZL7T&#xA;CQpvIQRwJ2AlQ1417GpHvXM7Ta2GXblJoy4TDfonH5IfmBc6PrUXlu/n/wBxF8zfVjIdoZiCeKkk&#xA;cVkP/DfMnMXtHSgjjHNt0+Xei+jc0bnOxV2KuxV2KuxV2KvLvz7/ADIl8peXY7LT246xq3JLd96R&#xA;xr/eSdKGlQAK9TuCKjMnTYuI+TVlnQeH/lv+U2uee7W91K2v4I3gm43BujIXd5BzL8lV6171zZT1&#xA;EcVAhx44zNllj/zj55wfVriyaW3itbbgDqDF/TkLIGpEvHk3HlQnYV75Z/KWMRB3vuY/lpEteavy&#xA;L8z6JpsmoRSQ6lbQKXuBByWRFG5bgw+JQOtDX2yzD2jjyHhOxYz08oi0R+SX5g3Wja1F5cvpS2k6&#xA;g/G1Lkn0Zz0Vd9lkO1Kfa+ZOUdo6UEcY5s9Pl3ovo7NG5zsVdirsVdirsVdirD5/76T/AFj+vNgO&#xA;TQVmFDsVT7y9/vNJ/r/wGYufm2w5MO178x9W0/zF5isYWshJodm9xp3l+RHOpauy2JuvUs29aOka&#xA;Sfu2CwSH4G6GmUM3n/mD86fN955Av3e503SHurLVzba7FJGyyva2kLRWtr9Sv7sW9873LlOU7ECL&#xA;lwqxVFUlv/M3nma91i2tNfuYJ5Lj6rcAz3Usscc2u2VpD61us0P1A+jcMLd4GVriLk5KvRgq9W8g&#xA;ah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fmpXd5+ampxXD&#xA;8/qIjtoTSlI+PqqtB4erTNtpQBEOJlO73z/nHbSbWz/LW0vYlHr6nNPNO/c+nK0CivgBF+OYmtkT&#xA;krubcA9LEfzU/NPzVov5jGy065MNhpXoc7QAcJzJGsz+ptU1WTj7UqN8ztJpITxWRuWjNmkJ7dHu&#xA;Gpafa6rpdzYXK87a8iaKRSP2XWlaHuM1MJmMgRzDmEWKfFjXs1hdw3kLcbi0lSaJga0eNgykEe4z&#xA;qswBjTqobF9r2DyPY27yNzkaJC7kAFmKipoKDf2zkzzdqFfAl2KuxV2KuxV2KvkH/nInWF1D8y54&#xA;0DJHZQpb8TQVdGYO+xPXYV8AM2uljUXEymy9R/5xZ/5R3Wf+YqP/AJN5X2hzHuZ6fkU5/OT80tc8&#xA;pahp+n6RFD6k8ZuZ5p1LgrzKKigFafZPI/KmOi0kcgJkjPmMTQZ75S15PMPlnT9Y9MR/XYQ8kXUK&#xA;4qrqK9QGBpmHmx8EzHub4S4hb5T/ADAtk0LzrqkNgfSFletJa8duFG9RAP8AV2zo8cuPECeoddIV&#xA;M0+vLB+djbvUnlEjVapbdQd6985g83ZBXwJdirsVdirsVdirD5/76T/WP682A5NBWYUOxVPvL3+8&#xA;0n+v/AZi5+bbDkmuUM3Yq7FXYq+T/wDnJnyydM88RavClLbVIQ0jcuR9dCQ1evEMKcfkadM2eknc&#xA;a7nGyjdn3/ONP5gabPoP+ErydYdQtJHk09HNPWhlJdlSvV0csSPA+xyrWYjfEGWGW1Mx83fk1onm&#xA;XzXBr9xcyQ09MX1oqKyz+lsvxE/DVQFOx2HbBh10scOEBZ4BKVpr+ZPnrTvKPly4uZZlGpTRsmnW&#xA;1RzeUigbj14ITVj9HUjKtNgOSVdOrPJPhD5S8q6VN5h81abpMUfrCedTMlVFYlPKQVYhalRQVO5o&#xA;M3mpy1ElwccLL7VtoFt7eKBSzLEiorMasQopUnxznCbdkqYFdirsVdirsVdir5Z/5yj8vz2nnCz1&#xA;tUAtb+3ERK1P72Ekkt2BYNsPYnNlpJemnGzDdmn/ADinJz8ua37Xcf8AybyGuNkMsA2LN/zJ/Kiy&#xA;87XFldNfNYXNopiZxGJQ8RPLjQslCDWhr36ZDS6w4gRV2nLh42SWkGjeU/LEULzC20vSbcK08p6K&#xA;g3Zj3Zj4dSdsx5GWSd9S2ACI9z5I1C4ufPHn91t0fnrN8xVEBZ0hZiSaLyJ9OIVNB2zfSkMeOu4O&#xA;ABxSfZVrE0NtDCzBmjRUZgKAlRSoG9M54uxVMCuxV2KuxV2KuxV8e63/AM5B+fLXWb+2jjsfTguZ&#xA;Y0rC5PFHKiv7z2zcRxCg4plugv8AoYz8wP8Afdh/yJf/AKqYfCCOIu/6GM/MD/fdh/yJf/qpj4QX&#xA;iL3v/nHrzzrXnDyzqV9qywrNb3voRiBCi8fSRtwWberZgauNSDdiNh6pmK2uxV2KuxVjnn7yPpnn&#xA;Py7No1/VAx9S3mABaOVQQrivhXt8ulRlmPIYGwxlGw+PPN3kDzd5Kv6ahbSpArVt9QjDek1GIU8x&#xA;9lqqdvpFRvm1x5RLk4koEIi0/Nz8w7e2FtH5hvhEBQBpmZgB2DNVh9+S8PH/ADQvFLvQFmvmvzbq&#xA;3pWqXWsanMQHdmaV9zxBkkc/CKnqxplhyxgO4MREkvp78l/ykTydZHU9RYS69eJSUgUWKM7+mtQG&#xA;/wBb9W22q1OoMzXRysePhen5itrsVdirsVdirsVdirHPP3kjTfOfl2bRr4lAx9SCYAFo5VB4uKjt&#xA;Xt8ulRlmPIYG2Mo2GF/kF5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26nIJUQwxxpjP/OQ&#xA;H5gea/KfnPTf0HqMlmJtPDSxgK8bETSCpjkDoT70y/SQjKJ4he7DLIg7PIdX8+fmB53uI7G7vLnV&#xA;JCax2cKBUqP2vShVE2H7RG2ZkRDHuBTSTKXN73+Sn5Nz+WOWteYI431mZAIodnFupo1FIPHlX7Rp&#xA;1Hw7Cra/U6nj2HJyMeOub2DMNudirsVdirsVdirsVfnj5l/5SPVf+Yy4/wCTrZvIcg4Z5pbkkOxV&#xA;9V/84jf8oVrP/bSP/JiPNbrfqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9dXedVVDYtCJUaIrsoW4&#xA;VuZcfLMNtYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWstwl2PShcr25MrHiFV11+&#xA;cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufzetLe90HSpG0Y6trUX1su&#xA;usINPW2af0Ymgu5IEkuZJt/TjSDchgSAAxVeiYqpz21vcJ6c8Sypv8LqGG4Knr7EjEFWNH8q/wAt&#xA;yat5a09m7s1ujEnxJIqT88s8afex4B3J1pOgaLo9utvpdlDZwrXikSBQOVKgeA26ZGUieaQAEfkU&#xA;uxV2KuxV2KuxV2KuxV2KrXiRxRhvQjkCQwB60YUI+jFWMeaPy08oeaNQtL7WbT6zPZjgnI1DJy5c&#xA;H5VPGtelOpy2GWURQYygCmeieUfLGhBho+mW9gH48vQjCVKggHbvv16nISmTzKREBNsil2KuxV2K&#xA;uxV2KuxV2Kvzx8y/8pHqv/MZcf8AJ1s3kOQcM80tySHYq+q/+cRv+UK1n/tpH/kxHmt1v1D3ORh5&#xA;PXdW8p6Rq2s2eqX6GdrO0vbAWjhHt5YNR9H11mjZW57WygCtKE1B7YbaxW4/JDyolxJLotxceXY5&#xA;b+PU5LXSodOjt2nggjggDQzWk6MkJiaWNSKCV3f7XHiqm8vkBpdWn1h/MGpnVTDJa2F5Sw5WUE80&#xA;c8scC/VODBzAi/v1kIXpSpxVKJvyS8sSWjWqX1/DFdW8lprPBreuoQzXUt5IlxygbhynuZWrb+kR&#xA;yoKACir0LFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Rta/wCc&#xA;afzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxzjKC/wChX/zV/wCWez/6SV/ph/NwR4Rd/wBC&#xA;v/mr/wAs9n/0kr/TH83BfCL3b8gPy+8x+SPLeo6frqRJcXN568QhkEg4ekibke6nMPU5BMghtxxI&#xA;D1DMdsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdiqGOpWIJBmUEbEYOINnhS7nfpOw/3+uPEF8KXc79J2H+/wBceIL4Uu5VhuIZlLRO&#xA;HANCR44gsZRI5qmFi7FXYq7FVO4uIbaB553EcMYLO56ADElXj/mv/nIzSrK+ks/L1oNV9MsjXRYp&#xA;ATQbo1KtRq9BQihDZh5NWI8t2mWYBiUH5+/mCzDnHZtEOoERDkf63Lj/AMLmKdfJq/MFnvlP8+NJ&#xA;1K5W01u2/Rc0jBYpg3OCpIFGc0K9SakUpmTi1sZGjs2Qzg83qasrKGU1U7gjM1vbxV2KuxV2KuxV&#xA;2KuxV2KuxVDahqmnadbtcX9zHbQIpZpJGCgKCATv4VGAkDmgljx/NP8ALsS+l+n7QtUCoeq7/wCU&#xA;Bx/HK/Hh3sfEj3p7pet6RqsIm028hu4jUB4XDg8aA0p4VGTjIHkyBBRuSS7FXYq7FXYq7FXYqxCb&#xA;++k/1j+vKC7SPJZil2Kp95f/AN5pP9f+AyyDh6nmE0ybjOxV2KuxV86/85E/mHcz6n/g/T5THbwg&#xA;NqbKWBdmoViIIX/WPWopQ9a4Opy9A0ZZdGDeQvIet+aLs22mQgrHQ3FzIeMUQPTk1D1psAK5gxxS&#xA;yGg44iZHZ6/af848KsI+s63SUjdY7eqg/NpKn7hmQOze+X2Nv5bzec+cfLMWga9c6N9ZF21sE5TB&#xA;PTqZEDgceT9mHfNfnx+HPhu3GyR4TT0T8j/PF08x8rahNzSJC+nO53CggGLkSNl/ZFD9AGbLQ5yf&#xA;SXKwZL2L2bNk5LsVdirsVdirsVdirsVYf+Z35hWHkvQHu3ZZNQmPp2VoGHN3YH4qUaiim7Hb5mim&#xA;rLk4QwnKg+ZpdQ82/mB5iiW7mN3fXktLa1DCOFCRQBFYhVoq0qdzTcnNXOcpyrq4spGRZtqH5Iax&#xA;onlu71nU7q3Q2qK4tYuUjHkyrRmIRR9rtXHJpJxiZErLEQLLEtMutR0m6S90u5e1uUIYPGdjxPIB&#xA;lPwsKitCMw4ZpRNhpjMh9Dflh+Y0Xmqye3vSkOs21BNCDT1AannGD1XbxqO/Ynd6bUDIPNzsWTiD&#xA;Osym12KuxV2KuxV2KsQm/vpP9Y/rygu0jyWYpdiqfeX/APeaT/X/AIDLIOHqeYea+bfJvnPWPzE1&#xA;680wB4v0dplnbtfP9UhFpPJdHUIrK9jtLqaKZhFGrcD9mSrbiLjNxkt8k6j+Zun+VLfT57W/sdW0&#xA;vy7bJ5a0OOzaSwu5ItKBBv7uS05QXC3ClTA00VGAX468iqivJHmL8z7rVrOHzRc6jb6axVtPmtNM&#xA;mZrmcyASW2pyTaVbm3jQUpKkEKlW/vGKk4qyD8n9Y/MjUk1N/OimKVRAUtZIJoWguCZPXjjdrKyh&#xA;khFE4enJPTesrchRV8yecLmafzzrkkztI4vrhObks3GOQotSdzRVGajLzLhzfVP5LaRa6f8Al5pj&#xA;wqPVvVa6uJAN2d2IFf8AVQBcz9LECA83IxCosA/Mv81fNlp5qu9L0m5+oWlgwi+BEZ5GoCzMzq3c&#xA;7AZg6nVTEyAaAaMuU3Qeb3+sX+q6jPqF/L615cENNLQLyIAHRQANh2Ga/JIyNnm40jZsorynqs2m&#xA;+cdJvYKGWKbZT0IZSpB+g5dpTUgWeI0X1rnQOxdirsVdirsVdirsVdir5L/P3zBc6p+ZFzYu1bbS&#xA;VW3hRWZl5Mod2ofssahWp/Lmt1Mrk42U7su/5x20Xy/d319e6giNqFi9s2mM0jIwZxLz4oGUP9le&#xA;oOR0cYmRJ5jkjCATu941uw0rUNLuLPVlVtPmAFwruY1oGBFXUqRuB3zY5IiQqXJyZAEbvnL8yNN0&#xA;LSfNclloiomniGJlVJGmXkwPL42Zz+OaLV44xnUeTr80QDslvkvWp9F85aXewtxDzpbzAsUVo5mC&#xA;HkR+yCQ30Y6SZjMLhlUn1bnQOxdirsVdirsVdirEJv76T/WP68oLtI8lmKXYqn3l/wD3mk/1/wCA&#xA;yyDh6nmE0ybjOxV2KuxV8afnB5cm8vfmDqMbBjBdyG7gkYglhL8TluOwPOpp4U2GazNCpFxZii9x&#xA;/wCcfvPmnan5Yh8uzzKmq6byWKJjRpYCxdWSvXhXiQOgAzI0uQVw9Q24pbUyPzd+UflnzLqR1KZ5&#xA;7S9kAE727Lxk4igLK6t8VABUYc2kjM3yKzwiRt4N+YWiWnljzXe6Ras7W1uIjC8pBcrJEr1YgKOr&#xA;Htmpz4eCZAcTJCpUi/yZ0WfXfP1rMIxJZ6WDc3RYEpuCqKSAdyTUV60zJ0eK5X3NmGO76lzbuY7F&#xA;XYq7FXYq7FXYq7FXxt+c1tJafmlrnOvGaZZo2IIqrop2r4NUfRmszj1Fxcg3TX8oJlbzxoi13+sr&#xA;/wAROY2EfvQ1wHqD6I/NdWb8vdZCgk+khoPASoTm01f92XKy/SXy8hCmpzQF16vo4a88yaVax15S&#xA;3cC1ALUHqAs1B/KN8vwR9QZ4xu+xs6B2LsVdirsVdirsVfB3mHz152j1/U44/MOppGl3OqIt5cAA&#xA;CRgAAH6DMUl6GEBQ2S//AB956/6mPVP+k24/5rwWy4B3O/x956/6mPVP+k24/wCa8bXgHc+mf+cW&#xA;tZ1jVfKGrTapfXF/MmoFEkuZXmZV9CM8QXLECpy/FydVrwBIe57RljguxV2KuxVhP5qflpY+eNFE&#xA;LMYdStAz2FwADRj1U1ps1PH9QpVlxcQYTjb5S1/yt5q8o6i0OpW0ls8LgR3SV9NmoGUpIO/EhqGj&#xA;DuBmunjIO7jmNI+D81fPsUaxr5gv+KigBuJDt8ya4OOfeUcR71fQfL/nrz7qfK1S4vXkYLcandM7&#xA;RoNh8czciaV6Cp9sY4pTKiBL6k/L38v9K8maKlja/vrt/ivL1gA8khpX/VXbZf1nfNnixCApyoxo&#xA;Mpyxk7FXYq7FXYq7FXYq7FXiv/ORH5bXOtWcXmXS0aXULJBFcW6hmaSGpPw7kVQ9FoK1PViBmLqM&#xA;d7hqyR6vAPKvmObQ9csNUjXm1jPHP6Z2DCNgxUn/ACgKZgDYg9zRyNvrvSvzT/LnWdNWca3ZQxzL&#xA;SW1vZY4JFqN0eOUrWnQ0qPfNoM0CObkiYL55/N3W9Dm87Xj6JLBLp4jhWJ7Xj6NViUMF4fDsfDNX&#xA;qIgzNcnFyAGWzNP+cf8AyDdXF+PN2pI0UUIppkTBlL81IM1QV2psOtQTUUKk5Wkw16i24odX0Bme&#xA;5DsVdirsVdirsVfnl5l/5SPVf+Yy4/5OtmIXo4fSEtxZOxV9V/8AOI//AChWs/8AbSP/ACYjy7Fy&#xA;dT2h9Q9zJvOHnTW/K/mu/vtUk1BdBis5pNEs7ZdPeyvLi00+a8nhnbhJqEcnGIslCqfD13obXASN&#xA;PPXnMeVZJ7jUryz8zWV/oU+qWlza6d6Bs9YvI7YRWht2uaQODJQySNMOO/GoxVO187+ZdT/Nafy1&#xA;EbzSNLk07UoLEzaZP8V5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WI&#xA;tNnuYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWNndoUuoEmQqUIdQ3wtTkN/GmAi1pjw/L&#xA;H8vg3IeX7ISf79EQElfHmPir71yHhR7mPAGSQ28EC8IY1iTb4UUKNhQbD2GWUyX4q7FXYq7FXYq7&#xA;FXYq7FXYq06JIjI6h0cFWVhUEHYgg4q8x8+fkF5U8zXM2o2rNpmpzVZ5IQPSdzTd0pT+Ykjck9co&#xA;yacS3a5YwWAn/nFXWhLRPMNuYf5zA4an+ryI/wCGyn8oe9h4TL/J3/OOPlnSLiO81m4bWLmJuSxu&#xA;oW3qCCpMZrXoQQxI3yyGmA5so4gHrkUUUSBIkCIKkKooKk1PTxJzJbV2KuxV2KuxV2KuxV+eXmX/&#xA;AJSPVf8AmMuP+TrZiF6OH0hLcWTsVfVf/OI//KFaz/20j/yYjy7FydT2h9Q9z2MeWvLg1eXWhpVm&#xA;NYuE9KfUhbxfWZI+IXg83H1GXioFCemWuApWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS&#xA;6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q&#xA;Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq+edT/5xI+u6ld3v+K/T+tTSTen+j+XH1GLUr9ZFaV8Mq8J2Me0KFcP2/sQ&#xA;3/Qnn/f3f9y7/s6weF5p/lH+j9v7Hf8AQnn/AH93/cu/7OsfC81/lH+j9v7Hqv5R/lh/yrzRbzTP&#xA;0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnE1GfxDdUzrJNDsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeE+eYtP1&#xA;78wPNVj5l1N/q2iWtnJ5d0WS7SxgmaWAPNKrOOLOjsd+prStBthZRxEg9OQaJiyWafkX5g1zXfIi&#xA;XWrtJM8VzLBaXc3IyTwIFIdnYn1CHZ05D+Wh3By3TSkYbs8RJG70LMhsdirsVdirsVdirsVdirsV&#xA;dirGPO3nyw8rCwt2tZ9R1fV5Gg0nTrYDlLKoH2nYhUQM6hm3IrWhocryZOH3ljKVLPJn5gWXmSe7&#xA;06a1k0rXtONL7SrgqzqK05xuu0kdduQA7dipMceYS25EIjO/eyrLmbsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVS3VfLHlrV5Ul1bSbLUZY14RyXdvFOyrWtFMisQK5EwB5hBAR1vb29tbx&#xA;W1tEkNvCixwwxqEREQUVVUUAAAoAMkAlUxV2KuxV2KuxV2KuxV2KuxV2KsB/NHyPruvXnl3XNBli&#xA;GqeW7prqO0uHaNJ0Yo7R+ooajMYFXfajGpGU5YE0R0YTiTuFD8vPIGq6f5p1jzlrf+i6jq6mOHSU&#xA;nN0tvFIUkkEk5Veb84wFC/Cq92r8McWKpGR5lEIUbei5kNjsVdirsVdirsVdirsVdirsVdirsVdi&#xA;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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynbe&#xA;YJ5YPIt1eTJ5h9NiqPIsYezSUp+84F0cmm21eoXMnT8jX1dGrJ0vkgvyquNDj/MTVdO8mS8/KaaZ&#xA;FPqUNu8k1lHqzShR6Mko5fFCrbj7VP8AJFJ5yTAGX1X9jHH9W3J7FmG3uxV2KuxV2KuxV2KuxV2K&#xA;pD5s89eU/KUNvN5h1FLFbpylupWSV3KirFY4ld+K7ValBUeIycMcpcgxlIDmivLfmfQfMumDU9Dv&#xA;FvbIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlE0UxkDuE0yCXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FVO5tre6t5ba5iSe3mUxzQyKHR0YUZWVqggjqDhBpVPT9N07TbRLLTrWGys4q+nb&#xA;W8axRLyJZuKIFUVJJOJJO5QBSIwJdirsVdirsVdirsVdirsVeb+cdC1a0/MF/OMdvNdaYnl24030&#xA;7FPXuxdCYyxqkPCSvqep8LcSoIPOgpXIxyHDw9eJrkDd+SL/AC10zWH1nzL5r1LTH0VfMMlobTTJ&#xA;uHrrFbQEetNwJ4vK0p5IQGUjfHNIUI3dLAbk97Pcx2x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxVxIAqemKvMfPn59+V/LN1Pptqjanq0JKPDER6aOOP25Og/aBA+IEfZoa5lYdLKe/Rq&#xA;nlAeb3X/ADkl5xub1JrWwgtbVaVteQk5UNTV2Su422zOj2cKcc6ksw8s/wDOSGmXc4h1/T207lQL&#xA;NC3qxiin7RPEjk1ANqDqWynL2dIDbdsjqQeb2K2ura6t47i2lWaCVQ8UqEMrKdwQR1BzXEU5KpgV&#xA;2KuxV2KuxV2KuxV2KsA88/nX5P8AKcv1WSQ6hqFFb6palXYK4JBZq8V/ZPxEVBqK5kYtNKbXPKA8&#xA;5H/OUOsOV4eXoOIPxk3D1YdqAJ8P45mjs2+rQdV5Mm8rf85GaDfzCDXrR9Kd2/dzKfVgApQBn2at&#xA;e/ED7t6svZ847jdlDUg83rdtcwXMEdxbyLLBKoeORTUMrCoI+jMAinJVMCuxV2KuxV2KuxV2KsOn&#xA;/vpP9Y/rzYDk45WYVdiqf+Xv95ZP9f8AgMxc/NthyTXKGbsVdirsVePf85C/mZd+W9Ii0TSJxHqm&#xA;qKyyypQyQwinJga1RmrQbd6g7ZlabDxGy05Z0HgfkPyNr3m3VPqWlxepIBzuLiQkRRKT9qR6Hqe3&#xA;U5tpZI443JxBEyNB7VZ/84ykW/8ApOvhbgjpFbckU/NpFLfcMx/5VrlH7W38p5sM89/lHr/lOH63&#xA;KyX2lkhTeQgjgTsBKhrxr2NSPeuZ2m1sMu3KTRlwyhv0Tj8j/wAwbnR9ai8tX8/+4i+ZvqxkO0Mx&#xA;BPFSSOKyH/hvmTmL2jpQRxjm26bLvRfR2aNznYq7FXYq7FXYq7FXlv5+fmRL5S8uR2Wntx1jVuSW&#xA;770jjX+8k6UNKgAV6ncEVGZOmxcR8mrLOg8P/Lf8ptc892t7qVtfwRvBNxuGujIXd5BzL8lV6171&#xA;zZT1EcVAhxo4zNlll/zj35wk1a4smlt4rS24A6gxf05CyB6RLx5tx5UJ2Fe+T/lHGIg733Mfy0iV&#xA;vmr8ivM+h6bJqEUkOpW0Cl7hYOSyIo6twYfEoHWhr7ZZh7QxzPCdixnp5RF80T+SP5hXWja1F5bv&#xA;pS+k6g/G1Lkn0Zz0Vd9lkO1Kfa+ZOU9oaUEcY5s9Pl3ovo/NG57sVdirsVdirsVdirDp/wC+k/1j&#xA;+vNgOTjlZhV2Kp/5e/3lk/1/4DMXPzbYcmHa9+Y+raf5i8xWMLWQk0Oze407y/IjnUtXZbE3XqWb&#xA;etHSNJP3bBYJD8DdDTKGbz/zB+dHnC88gag73GnaQ91Zav8AVteikjZZXtbSF4rW1+pX92Le+d7m&#xA;QpynYgRcuFSVRVJL7zN56mv9Zt7XX7mGeS5+qzAz3UskcU2t2NnCJrZZoRYH0p2Fu8BDXEXJyyvR&#xA;gq9X8gah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fupXd5+&#xA;ampxXD8/qIjtoTSlI+PqqtB4erT8c22lAEQ4eU7vfP8AnHbSbWz/AC0tL2JR6+pzTzTv3PpytAor&#xA;4ARfjmJrZE5K7m7APSxD81fzU81aL+YxstOuTDYaV6HO0AHCcyRrM/qbVNVk4+1KjfM3SaSE8Vkb&#xA;lozZpCe3R7jqen2uq6Xc2FyvO2vImikUj9l1pWh7jNTCRjIEcw5khYp8VNezWF3DeQtxuLSVJomB&#xA;rR42DKQR7jOqzAGNOphsX2zYPI9jbvI3ORokLuQAWYqKmgoN/bOUPN2wV8CXYq7FXYq7FXYq+QP+&#xA;citYXUfzMnjQMkdlClvxNBV0Zg77E9dhXwAza6WNRcTKbL1H/nFn/lHdZ/5io/8Ak3lXaHMe5lp+&#xA;RTn85PzT1zyjqGn6fpEUPqTxm5nmnUuCvMoqKAVp9k8j8qYdFpI5ATJc+YxIAZ75R19PMXlnT9Y9&#xA;MR/XYQ8kXUK4qrqK9QGBpmHmx8EzHuboS4gC+U/zAtk0LztqkNgfSFletJa8duFG9RAP9XbOixy4&#xA;8QJ6h10hwzNPr2wfnY271J5RI1WqW3UHevfOZPN2YV8CXYq7FXYq7FXYqw6f++k/1j+vNgOTjlZh&#xA;V2Kp/wCXv95ZP9f+AzFz822HJNcoZuxV2KuxV8n/APOTXlk6Z54i1eFKW2qQhpG5cj66Ehq9eIYU&#xA;4/I06ZstLO413OLmjuz3/nGj8wdNn0H/AAjeTrDqFpI8mno5p60MpLsqV6ujliR4H2OV6zEb4gyw&#xA;y2pmXm78mtD8y+a4NfuLmSGnpi+tFRWWf0tl+In4aqAp2Ow7YMOtljhwgJngEpWmv5lee9O8o+XL&#xA;i5lmUalNGyabbVHN5SKBuPXghNWP0dSMq02A5JV06s8uThD5Q8q6VN5h81abpMUfrCedTMlVFYkP&#xA;KQVYhalRQVO5oM3mpy1ElwMULL7XtoFt7eKBSzLEiorMasQopUnxznCbdmqYFdirsVdirsVdir5Z&#xA;/wCcpPL89p5ws9bVALW/txEStT+9hJJLdgWDbD2JzY6SXppxsw3Zp/zinJz8ua37Xcf/ACbyGuNk&#xA;JwDYs2/Mn8p7LztcWV0181hdWimJnEYlDxE8uNCyUINaGvfpkdLqziBFXbLLh42S2kGjeUvLEULz&#xA;C30vSbcK88p/ZQbs3+Ux8O52zHkZZJ31LYAIjyD5H1C4ufPHn+RbdH56zfMyogLOkLMSTReRPpxC&#xA;poO2b6Uhjx13B14HFJ9l2sTQ20MLMGaNFRmAoCVFKgb0zni7JUwK7FXYq7FXYq7FXx5rf/OQfny1&#xA;1m/to47H04LmaNKwuTxRyor+89s28cYoOIZG0H/0MZ+YH++7D/kS/wD1UyXhBHEXf9DGfmB/vuw/&#xA;5Ev/ANVMfCC8Re9/849eeda84eWdSvtWWFZre99CMQIUXj6SNuCzb1bMDVxqQb8RsPVMxW12KuxV&#xA;2Ksc8/8AkfTPOfl2bRr+qBj6lvMAC0cqghXFfCvb5dKjLMeQxNhjKNh8d+b/ACB5u8lX9NQtpUgV&#xA;62+oRhvSajEKeY+y1VO30io3zaY8olycSUCERafm7+YdvbC2j8w3wiAoA0zMwA7Bmqw+/J+Hj7gj&#xA;il3oCzXzX5u1b0rVLrWNTmIDuzNK+54gySOfhFT1Y0yZyxiO4MREkvp78l/ykTydZHU9RYS69eJS&#xA;UgUWKM7+mtQG/wBb9W22r1GoMzXRy8ePheoZitrsVdirsVdirsVdirHPP3kjTfOflybRr8lAx9SC&#xA;YAFo5VB4uKjtXt8ulRlmPIYm2Mo2GFfkD5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26jI&#xA;JUQwxRItjP8AzkB+YHmvyn5z039BajJZibTw0sYCyRsRNIKmOQOhPvTL9JCMoniF7sM0iDs8h1fz&#xA;5+YPne4jsbu8udUkJrHZQoFSo/a9KFUTYftEbZmREMe4FNBMpc3vn5J/k3P5Y5a15gjjfWZkAih2&#xA;cW6mjUUg8eVR8Rp1Hw7Cra/U6nj2HJycWKub2DMNudirsVdirsVdirsVfnh5m/5SPVf+Yy4/5Otm&#xA;7jyDhHmluSQ7FX1Z/wA4jf8AKFaz/wBtI/8AJiPNdrPqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9&#xA;dXedVVDYtCJUaIrsoW4VuZcfLMNuYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWst&#xA;wl2PShcr25MrHiFV11+cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufze&#xA;tLe80HSpH0Y6vrUX1ssNYQaets05hiaC7kgR7mSanwRpBuQwqAORVeiYqpz21vcJ6c8Sypv8LqGG&#xA;4Knr7EjEFWMn8q/y3Jq3lrT2buzW6MSfEkipPzyzxp97HgHcnekaBouj262+l2UNnCteKRIFA5Uq&#xA;B4DbpkZSJ5pAAR+RS7FXYq7FXYq7FXYq7FXYqteJHFGG9COQJDAHrRhQj6MVYx5o/LPyh5o1C0vt&#xA;ZtPrM9mOCcjUMnLlwflU8a16U6nLIZZRFBjKAKZ6J5R8saEGGj6Zb2Afjy9CMJUqCAdu+/XqcjKZ&#xA;PMpEQE2yKXYq7FXYq7FXYq7FXYq/PDzN/wApHqv/ADGXH/J1s3ceQcI80tySHYq+rP8AnEb/AJQr&#xA;Wf8AtpH/AJMR5rtZ9Q9zkYeT13VvKekatrNnql+hnaztL2wFo4R7eWDUfR9dZo2Vue1soArShNQe&#xA;2G3MVuPyQ8qJcSS6LcXHl2OW/j1OS10qHTo7dp4II4IA0M1pOjJCYmljUigld3+1x4qpvL5AaXVp&#xA;9YfzBqZ1UwyWtheUsOVlBPNHPLHAv1TgwcwIv79ZCF6UqcVSib8kvLElo1ql9fwxXVvJaazwa3rq&#xA;EM11LeSJccoG4cp7mVq2/pEcqCgAoq9CxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KvkXWv+cafzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxjiKC/6Ff8AzW/5&#xA;Z7P/AKSV/ph/NwR4Rd/0K/8Amt/yz2f/AEkr/TH83BfCL3f8gPy+8x+SPLWo6frqRJcXN59YiEMg&#xA;kHD0kTcj3U5h6nIJmw3Y4kDd6hmO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDHUrEEgzKCNiMHEGzwpdzv0nYf7/XHiC+DLud+k&#xA;7D/f648QXwZdyrDcQzKWicOAaEjxxBYyiRzVMLF2KuxV2KqdxcQ20DzzuI4YwWdz0AGKCaeQeav+&#xA;cjdJsbyWz8v2Y1Vo2Km7LlIDt1U0JajV6bEbhsBLg5tfGPLdiMH5+fmCzDlHZmIdQIiHI/1uXH/h&#xA;cjxOCe1JBn3lP8+NJ1K5W01u2/Rc0jBY5g3OCpIFGc049SakUphEnLwdpQmaOz1JWVlDKaqdwRkn&#xA;ZN4q7FXYq7FXYq7FXYq7FXYqhr/UtP0+3a4vriO2hQFmeRgoABAJ3+YwgWgyA5pEfzN8gCX0/wBO&#xA;2paoFVeq7/5QHH8cn4Uu5q/MY+8J1pus6TqcQm067iuojUB4nDA8aA9PCoyBiRzbIzEuRRmBk7FX&#xA;Yq7FXYq7FXYqxCf++k/1j+vKC7WPJZiydiqfeX/95pP9f+AyyHJwdV9QTTJuM7FXYq7FXzr/AM5E&#xA;/mHcz6n/AIP0+Qx28IDamylgXZqFYiCF/wBY9ailD1rEl1utzfwhg/kLyHrfmi7NtpkIKR0NxcyE&#xA;rFED05MAetNgBXBTq4YZ5ZVF69af848IsI+s63SWm6x2/wAIPzaSp+4YeFyx2P3y+x5z5x8sxaBr&#xA;1zo31kXbWwTlME9PeRA4HHk/Zh3yJdTqcPhZDG7p6J+R/ni6eZvK2oTc0iQvp0jncKCAYuRI2X9k&#xA;UP0AZKJdz2ZqjIcBezZJ3DsVdirsVdirsVdirsVYl+ZPn6x8naE125WS/mPp2dqGHN2IPxUo3wim&#xA;5O3zNFNmOHEWnNlEA+c3vfNXnzzBH9clN1e3clLe2DCOFCRQBFY8VoopU7mm5OZ8YCIt0+TJLJKu&#xA;pZte/k1qmj+X7nVtRuYENsqt9Wi5SMeTBaMxCgfa7VxhqIykAAjLopxgZSPJjOny3+mXK3mmXD21&#xA;whBDodjxNQGU/CwqOhGZMsYkN3Bx55QNgvdfy58/p5ltHt7wpDq9vT1YgacwannGD22+Y79idVnw&#xA;8B8nodJqhlHmzTKHMdirsVdirsVdirEJ/wC+k/1j+vKC7WPJZiydiqfeX/8AeaT/AF/4DLIcnB1X&#xA;1B5r5t8m+c9Y/MTXrzTAHi/R2mWdu18/1SEWk8l0dQisr2O0upopmEUatwP2ZKtuIuM3GS3yTqP5&#xA;m6f5Ut9Pntb+x1bS/LtsnlrQ47NpLC7ki0oEG/u5LTlBcLcKVMDTRUYBfjryKqL8k+Y/zPutXtIf&#xA;NFzqNtprFW0+a00ydjczmQB7XU5JtKt2t40FKSpBEpVv7xipOKp/+T+sfmRqSam/nRTFKogKWskE&#xA;0LQXBMnrxxu1lZQyQiicPTknpvWVuQoq+ZfOFxNP551ySZ2kcX1wnNyWbjHIUWpO5oqjIF0OfmX1&#xA;R+S+kWun/l5pjwqPVvVa6uJAN2d2IFf9VAFyQdnooCOMebAPzL/NXzZaearvS9JufqFpYMIvgRGe&#xA;RqAszM6t3OwGRJdbrNdkGQxiaAeb3+sX+q6jPqF/L613cENNLQLyIAHRQANh2GB1OWZmeI8yivKe&#xA;qy6b5x0m9gAMsU2ynoQylSD9BxDkaGRjkBfWuWPVuxV2KuxV2KuxV2KuxV8rfnpr1xqn5i3Fk7Vt&#xA;9KVbeFFYsvJlDu1D0Y1CtT+XM3BGg6nVzuXuZf8AkDo2h3N3eXl8im+s2t205mkZCGcS8+KhlD/Z&#xA;HUHJamRAAHJjoYxlIk8xVfa9u1ix02+02e01MK1jKAJwzmMUDAirKVI3A75hQkQbHN2uSMZRIlye&#xA;CefbHRdM8zPZ6OqrYiKNlCSNKOTA8viZnP45ttPOUo+rm83rcUIzqHJLfKurzaR5t0y8hbiHmSCY&#xA;FiqmOVgp5EdgSG+jHURuJXRZDHIH0zmnendirsVdirsVdirEJ/76T/WP68oLtY8lmLJ2Kp95f/3m&#xA;k/1/4DLIcnB1X1BNMm4zsVdirsVfGv5weXJvL35g6jGwYwXchu4JGIJYS/E5bjsDzqaeFNhkC6bU&#xA;46kXuH/OP3nzTtT8sQ+XZ5lTVdN5LFExo0sBYurJXrwrxIHQAZIOXosoMeE8wyPzd+UflnzLqR1K&#xA;d57S9cATvbsvGTiKAsrq3xUAFRiQuo0EMsuI2C8G/MLQ7Tyx5rvdItWdra3ERheUguVeJXqxAUdS&#xA;e2QIdHqtPwZDEckX+TOiz675+tZxGJLPSwbi5LAlNwVRSQDuSaivWmEOX2fhud9z6lybv3Yq7FXY&#xA;q7FXYq7FXYq+QvzgtpLT8zta514yzLKjEUqrop2r4Go+jM7EfSHUakesp1+U06v5w0da7+uD/wAK&#xA;cvyH92XEwD99H3vfPzNUnyJq4AqfTQ7eAlUnMDT/AFh3Gt/upPnBCFNTm4eZKppxa78waZaxk8pb&#xA;qFagFqD1BVqDwG+U5pekuTpoXMe99ZZp3p3Yq7FXYq7FXYq+DfMPnrztHr+pxx+YdTSNLudURby4&#xA;AAEjAAAP0GYpL0cIDhGyX/4+89f9THqn/Sbcf814LZcA7nf4+89f9THqn/Sbcf8ANeNrwDufTP8A&#xA;zizrOsar5Q1abVL64v5k1Aokl1K8zKvoRniC5YgVOXYuTqe0ABIe57TlrgOxV2KuxVhP5p/lrY+d&#xA;9FELMYdStAz2FwADRj1U1ps1PEfgKAhpz4RMeb5S1/yt5q8o6iYdStpLZ4XAjukr6bNQMpSQd+JD&#xA;UNGHcDIuoyYjE7o+D81fPsUaxrr9/wAVFBWeQ7fMknFHiZP5xV9B8v8Anrz7qfK2S4vXkYLcandM&#xA;7RoNh8czciaV6Cp9saWGCWQ976k/L3yBpXkzRUsbX99dv8V5esAHkkNK+PFdtl/Wd8kA7jDhEBQZ&#xA;ThbnYq7FXYq7FXYq7FXYq8b/AOcgfy6uNYtIvMemI0t/ZKIp7dQzNJDUn4dyKoei0FanqxAy/DOt&#xA;nD1WK9w8J8q+ZJtE1qx1JBzaznjm9M7BgjAlfpG2ZZ3FOtG0ge59X6X+Z35favp6zjWbOFJVpJbX&#xA;kscEi1G6skpWvhtUZgnHIHk7iOeEhzDwb81td0WXzhdto8sEtgEhWN7biYqiNQ3Hh8PXwzPwyIju&#xA;6fVQichMeTLfyI8j3dzfjzXqKNFDCKabGwYFy4IMtRx2psOtQTUUKk4+oy3s5ei09eovd8xHZuxV&#xA;2KuxV2KuxV+ePmX/AJSPVf8AmMuP+TrZiHm9LD6QluBk7FX1X/ziN/yhWs/9tI/8mI8vxcnUdo/W&#xA;Pcyfzh501vyv5rv77VJNQXQYrOaTRLO2XT3sry4tNPmvJ4Z24SahHJxiLJQqnw9d6G116Rr5685D&#xA;ytLPPqV5Z+ZbK/0KfVLO5tdO9A2esXkdsIrQ27XIELgyUMkjTDjvxqMVTtfO/mXU/wA1p/LURvNI&#xA;0uTTtSgsTNpk/wAV5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WItNn&#xA;uYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWVndoUuoEmQqUIdQ3wtTkN/GmKCAWPD8sfy+&#xA;Dcx5fshJ/v0RASV8eY+KvvXGmvwYdzJIbeCBeEMaxJt8KKFGwoNh7DFtpfirsVdirsVdirsVdirs&#xA;VdirTojoyOoZGBVlYVBB2IIOKvNfPH5E+V/MlzNqFsW03Upas8kIHpu5pu6Up4kkbknrlsMxDjZN&#xA;NGW/Vgp/5xf1kS0TX4DD/OYHDU/1eRH/AA2W/mPJo/JHvZZ5R/5x58uaTPHd6vcNq1zE1VjdQtvU&#xA;EFSY969CCGJG+QlnJ5NuPSRHPd6vHFHEgSNQiCpCqKCpNT08TlDl0uxV2KuxV2KuxV2Kvzx8y/8A&#xA;KR6r/wAxlx/ydbMQ83pYfSEtwMnYq+q/+cRv+UK1n/tpH/kxHl+Lk6jtH6x7nsg8teXBq8utDSrM&#xA;axcJ6U+pC3i+syR8QvB5uPqMvFQKE9MtdepWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS&#xA;6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q&#xA;Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq+eNT/5xH+vald3v+K/T+tTSTen+j+XH1GLUr9ZFaV8MqOLzdlHtGhXD9v7&#xA;EN/0J3/393/cu/7OsHhebL+Uv6P2/sd/0J3/AN/d/wBy7/s6x8LzX+Uv6P2/serflH+V/wDyrzRb&#xA;zTP0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnD1GfxDdUzrJOO7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXhPnm&#xA;HT9e/MDzVY+ZdTf6toltZyeXtEku0sYJmlg5TSBnHFnR2O/U1pWg2iXXZwJSkD05C6Zp+RfmDXNd&#xA;8iJdau0kzxXMsFpdzcjJPAgUh2difUIdnTkP5aHcHCG7RzlKHqehYXLdirsVdirsVdirsVdirsVd&#xA;irHfOHnax8tCxga2mv8AVNVkaDTNPtwOUsigfadiFRAzKGbcitaHfLMePi8gGjNnEKFWTyW+U/O1&#xA;pr011YTW0mm61Yn/AEzTZypdRWnONl2kSu3Knh4issuEwo84nqw0+qGQmPKQ5hkmUuU7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUt1Xyx5a1eVJdW0my1CWNeEcl3bxTsq1rRTIrECuLGU&#xA;InmEdb29vbW8VtbRJDbwoscMMahEREFFVVFAAAKADFIFKmKXYq7FXYq7FXYq7FXYq7FXYqwf8yfJ&#xA;uta3d6DrOiSxDUvL1y1zHbTs0aTIxR2TmoahJhC77UJqcvw5AAQeri6nDKRjKPOKn5F8k6rZeZNV&#xA;82ayfq99qi+nDpaTG5W3ico7iSYqvNuaAKF+FR3NdpZs1xERyDDTabhmch2MunNnmYzmuxV2KuxV&#xA;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’5 nZ¦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òÐ&à‘¿—µL X‘¢EpÒïdüã„Àsômš»¥ì“¢Åxf†Íœ+ˆìÚ‹C?œÖ ŸU\ó†J³ôµŠ×scàÐ}„»½ÖÕGäl–²EÔ\8ÂK Gì.%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*U zE';«‹ø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êDfh E%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?r 9‹\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”,ê}çïé/÷ñ¿ÀHh 8ð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˜I JlN<ž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‘ˆ,~¥³|eG½-í…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?r 9‹\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”,ê}çïé/÷ñ¿ÀHh 8ð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˜I JlN<ž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¥Ùç®C B2 -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ö9­Ne4,Û¤ß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¦6 M«-Õ-\ ³)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ú™I­K0×·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Èe­­y#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'‡t gyf<#.þ\¯Ô‰Á‹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û·e­X-œ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{íl dΘ|\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Õ <ô™--ír­4\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<ádj 14º³_åÙ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ëT 2/Ø–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–à/ÙW J”mm±SW ‡¿ϺŽõ
-lOYîáIRe.¼4J—²|‘OÖϪÛZE|¼ÉðôæEì †s®ósݤϠw{ò2L®§Oj2ÈlÇ®êÝ+˜ßT½eÛ¦Äk‚ýªë• «… ¥ +™´¤M]ÅÈ¥mß?¶µÂ}ñT­•‰v+[Dy­bdß~µ(ʶg$MÇa];Ë°†÷^> &¨p_u5"HÁ›ÙL”zäKÆ·sí`g1v/˜O¶Rz¼ ½’ÅóSk³&vXô§YFuc™Ù×#¬W>´/I?H-¾£NˆM¦ìm% jqQŸc9YËéi­d5‰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%ÿ•1G Q$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ØÚf­Q5˜™çÁ53òÄ¡›Y!XFÈ]niJ v€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‚!ä<ØìŠ+«¸4 b®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>E jš\Ð÷£µõ¹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«>ú‘P­1Ø·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‚w V˜,Î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ê<(iJ 7,+§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 T­oÿš‚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‘¿BN­n‹)ô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ÚÅ/S9Y6 m¶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ëÂ9­lNspN~¨Ô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ÙU wN´šë·‡Â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€8 I €Ã 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‚_6I YݦoY6³¯ˆúü`\ü䲬ƒçÝõ‚ Þö°bÏ^­/c›9¤”ûð>G2¬¢Áu1ôV­Gìÿ¾Æ¹]«õ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Ò|ÕÍä™o­my”}î_žü­§´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‰ÄŠÑ„öÛ´Y­x'#¾€~Ç]&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 %+¬àó)ŒO­0˜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¬¥ÁÅñ¹º_ ŸC­9{,Ø£Ïû
+ö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ŒI0 kÛ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ݸ™­A 6Þ„Ñ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
+7­V×;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¥C­q¡<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’™†ÇýL Z}¼“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–1G X$µ!äå×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êN R“ß<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î“M­ F¿Ø¹/ÞÁ$~õÙ|ùÙÕ«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óQ5­uVœ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ÏTh eˆöºóE¥^^8‘Úš 0@< É ^Íã
+…˜ƒtáMyh"ÆÕ¤a\)D­IÍ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|ð2 J¦+Ý–•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…¶ˆu JT „¾LôJc뾌˜'ÅÍáºs"{ú*|^¶†E2h›¿@%rdÎÙÈí.óØž"òÐÕ<`˦Ì6¼Fc­gÆ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.&O Kd)Öÿªê%¤¸Ëû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ÒÆW f”È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&F WQ·¹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, B z˜É‰ŠÅ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.aS 3Éáâ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[^À’x­Hêͺ_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äf­UÓ^Œ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ì…
-‘|w Q#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¸3 SÕù;ɶ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Ù\ßØ’¾ãþ ›‘Ú
+jt­9Î>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Š!&#1I5ü©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ŠZ e.Š·Š·&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ŽQ­CÒ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²a­M–¦Éž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ˆß¶øÊ:Ýo­y ã…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Ò0­t¥„[ 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*V j!ùÙ:
+Ûä
+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ƒïgr o†\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ÀzO3­­nûÖ-‡[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¸®J­Z>e.‰ÚÒ´.Gìçöäu a°ãÍ$Ú΄#>ì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Ê…ÇÌUW­Rº&[ÍÖ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æšÔË6 Ek«é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 Žm­1KÆé’–5 'äš"þÚU­e®·gRrf’A÷ûÄ·Îü­äØÉ´Žrét«xç¸FuÔÆW®J'1±tØü|6X€úò?:B’ãAŒ\2:ÌX n G8\©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|4 y±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Ž1 lþ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Ó±ÈB­YÞûÇ>ʦãõâ†_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êö >÷Ŷ]d­aK0­_r.1§65‹ ’%¾F|…•­û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¾ùÆç/üë}䪃ýë»o­40¹Ëõ·¾?õ¡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ÁdBu X!º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¥%Ï‚NV i«ÐßžÏÍÝ‘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ý%­Ëb tRs°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ÿšÒ”ÒIk QSŒ´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}r2 whFμÈ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Ñ-‰…š‘_ù|ÆÌm­XëÇÄÆØ~Õ1›È÷%IÃA_c @çF»JViÈZg4-% ]ÚU.îyì‰MÊÀb­‡N*qÍ¿E!TKT¥”lçÆ–Ïš£À$yFô e*-|xŽÆoÍêvËMiþ1k GLOw8´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Ù{)›Ý‰ÛZ­Y õ së]Çl d¶T$z§U¤eW3¯@–Û%ÃG­3“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¹u­zäà“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îîÄm­Wéõ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Œã‡4ssVw­hngXB4 ¥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‡4d­24ÃÐÃœ(?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él5 rðᤥ”‘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͸àƉÜ{6­7¼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îóCz­uŸ 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;ÀÙâÂÔSg H2¬!¶ ‚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=þ–l n —=Œ"ʯ®‚¾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ªh Z·¶±(„Á¨Ç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/ñ`œÍ0H Z6Ñ’Ï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ºÚ&©®Dm m¥!à–þ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Ëe 4º‡%,Âë(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^ù$Q­J7÷$áÅø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ÊÍØç$ôls0 nž¥mœ7Z妣q²ÍÂÓcì|&”Ñbš4d —€ésó+É$ ïÇa¾Ç΃Ͼs
-à”[EI i .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Ð6­EÚ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ä ‚K­Dõ_Íî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½à»à‡¡‘µY oŠ£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_ ÏN­jÖ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ÊV j!ÚÜ ªÃàÏ’²^Ó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Ÿ Þ3­s«˜\©… Õ=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 [T d2·¤ó
-Í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«Ñíúßžž#_ág­qÚ;´·¼Ç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™ÀL­A 3÷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=m­MꃲþÐÀ”=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ƒø5 kþ˜µê„gÒ¬†2Ä0o,§—xE=-Æ'˜}`¿wUà7³¯Tg½ÞID­ZÎ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ì¨æb Olr6 œ«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…&B­s†*™ °,ýŸ«ý³:ê_Ïó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õ XaVt Em°¶³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Èt­tɘí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=XB­uH®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—¾g 9~„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æ«*ìåÅMv NË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ÎàP i•›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$a iÇ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ÌÓ´Ÿ‰oxt kKÆV,îzÉu¹Ö¿d8ÖþH¹k¹×ÞŽ<h–"ã¨ä¯éï•zŒPI ¡EwÝø4‹5°ç^*Oj“਴ˆkÖñOTz¬Ÿx/Fawãr
-g™ã²ãé#Eó2„u c ¸†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Ý㔶ÌÑÃR­W]“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•’]†çÆU i(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##]!*[#™4x b’Ëd‹Òþ+v³–‡ºšÓ4d‘,D!‰‹Ôk€¹)o¸´¢ö“DRÕùW–Ä…!6U.Á‚ÛŒ¶ú¥5ý
-š.4&V UõÈNò˜¦Nò^1#ïL.ÑfÀœÇv#ßG xÎV³UÅÝñ¤Ž~l†P3ËD&ó(¹ô-ô2@4€7I,Å
-‹QQ Í›Ó$µ0PÀ·elfᇒq0è€ 'tÂD2´ Šv­3ŠÙ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ººg m(ØéÆÔ# 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¦‘…t Q*
-ì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œØP c¬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²³øC­oœ ‰*±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Ü<à/Óøh c‡ÄÎâÝÉ:»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;u­z:Ð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ñL 3"¥~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ò7­x’³@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ÃÃ(æÔm8­fw@Ò£Oµ­y¨6£ÅBQˆê6ÍæW¢ÑíS˜ZœëRÎ,¨%ÌH·‹õÚŒ ù ì3ÞDÁ4q«§WBÉÒëì!”‘Ä=
-Ë[F÷3ÞL5­Aoô+8ºâèp¥qÝÚ4Ë\øÐðsš]æ}=4Êy g¶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 td V Áð—©ï¬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ƒJ­MQUåµÑš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{ª ¢(³b­h¢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‘#í_t­o7“&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
+ɳÏþ?DE­T´:Î 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-g d‘"¯ë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&­ùˆ|Úø"Ã$áaRP iè|“ýß ’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-$ÝR­Stkî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í‚
+í$r wp`*¾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é)†¯ˆ'lI­ u5C[¬+¹”{¡[Vó;MY¨ ­¿ÚšK ÍX8ÙóáBDÐ¥.úeˆj)‹DͬÌéaU«Žjʺ&Æú«®o*U S†¤Óª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 &lt;= n &lt; 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 &lt; line2) || (line1 == line2 &amp;&amp; column1 &lt; column2)</code>
- * <div>implies</div>
- * <code>encode(line1,column1) &lt;= 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
diff --git a/test/files/presentation/simple-tests/SimpleInteractiveTest.scala b/test/disabled/presentation/simple-tests/SimpleInteractiveTest.scala
index 014fd24b6f..014fd24b6f 100644
--- a/test/files/presentation/simple-tests/SimpleInteractiveTest.scala
+++ b/test/disabled/presentation/simple-tests/SimpleInteractiveTest.scala
diff --git a/test/files/presentation/simple-tests/src/Tester.scala b/test/disabled/presentation/simple-tests/src/Tester.scala
index cb62187514..cb62187514 100644
--- a/test/files/presentation/simple-tests/src/Tester.scala
+++ b/test/disabled/presentation/simple-tests/src/Tester.scala
diff --git a/test/files/run/bug4279.scala b/test/disabled/run/bug4279.scala
index 89a27fc065..d0afc3a032 100644
--- a/test/files/run/bug4279.scala
+++ b/test/disabled/run/bug4279.scala
@@ -32,7 +32,7 @@ object Test {
// warmup
{ val r = new Runner(1000000, 10) ; r.straightSlice ; r.iteratorSlice ; r.viewSlice }
- new Runner(10000000, 10) run 100
- new Runner(10000000, 50) run 50
+ new Runner(10000000, 10) run 500
+ new Runner(10000000, 50) run 300
}
}
diff --git a/test/files/script/fact.args b/test/disabled/script/fact.args
index 7ed6ff82de..7ed6ff82de 100644
--- a/test/files/script/fact.args
+++ b/test/disabled/script/fact.args
diff --git a/test/files/script/fact.bat b/test/disabled/script/fact.bat
index bee0ba25c6..bee0ba25c6 100755
--- a/test/files/script/fact.bat
+++ b/test/disabled/script/fact.bat
diff --git a/test/files/script/fact.check b/test/disabled/script/fact.check
index 22aa60821e..22aa60821e 100644
--- a/test/files/script/fact.check
+++ b/test/disabled/script/fact.check
diff --git a/test/files/script/fact.scala b/test/disabled/script/fact.scala
index d48dac6f0f..d48dac6f0f 100755
--- a/test/files/script/fact.scala
+++ b/test/disabled/script/fact.scala
diff --git a/test/files/script/second.bat b/test/disabled/script/second.bat
index 0d7085954d..0d7085954d 100755
--- a/test/files/script/second.bat
+++ b/test/disabled/script/second.bat
diff --git a/test/files/script/second.check b/test/disabled/script/second.check
index a105b862a1..a105b862a1 100644
--- a/test/files/script/second.check
+++ b/test/disabled/script/second.check
diff --git a/test/files/script/second.scala b/test/disabled/script/second.scala
index 48b8d73815..48b8d73815 100755
--- a/test/files/script/second.scala
+++ b/test/disabled/script/second.scala
diff --git a/test/files/script/t1015.bat b/test/disabled/script/t1015.bat
index 7475313d7e..7475313d7e 100755
--- a/test/files/script/t1015.bat
+++ b/test/disabled/script/t1015.bat
diff --git a/test/files/script/t1015.scala b/test/disabled/script/t1015.scala
index 52d67bd6cc..52d67bd6cc 100755
--- a/test/files/script/t1015.scala
+++ b/test/disabled/script/t1015.scala
diff --git a/test/files/script/t1017.bat b/test/disabled/script/t1017.bat
index 369dbd2aca..369dbd2aca 100755
--- a/test/files/script/t1017.bat
+++ b/test/disabled/script/t1017.bat
diff --git a/test/files/script/t1017.scala b/test/disabled/script/t1017.scala
index d1b43ea923..d1b43ea923 100755
--- a/test/files/script/t1017.scala
+++ b/test/disabled/script/t1017.scala
diff --git a/test/files/jvm/interpreter.check b/test/files/jvm/interpreter.check
index 3c0ee7b4bd..dd0f39551c 100644
--- a/test/files/jvm/interpreter.check
+++ b/test/files/jvm/interpreter.check
@@ -2,222 +2,360 @@ Type in expressions to have them evaluated.
Type :help for more information.
scala>
-scala>
-scala> res0: Int = 7
-scala> | | | | gcd: (x: Int,y: Int)Int
+scala> // basics
+
+scala> 3+4
+res0: Int = 7
-scala> five: Int = 5
+scala> def gcd(x: Int, y: Int): Int = {
+ if (x == 0) y
+ else if (y == 0) x
+ else gcd(y%x, x)
+}
+gcd: (x: Int,y: Int)Int
-scala> x: Int = 1
+scala> val five = gcd(15,35)
+five: Int = 5
-scala> x: Int = 2
+scala> var x = 1
+x: Int = 1
-scala> three: Int = 3
+scala> x = 2
+x: Int = 2
-scala> defined type alias anotherint
+scala> val three = x+1
+three: Int = 3
-scala> four: anotherint = 4
+scala> type anotherint = Int
+defined type alias anotherint
-scala> <console>:8: error: type mismatch;
+scala> val four: anotherint = 4
+four: anotherint = 4
+
+scala> val bogus: anotherint = "hello"
+<console>:8: error: type mismatch;
found : java.lang.String("hello")
required: anotherint
val bogus: anotherint = "hello"
^
-scala> defined trait PointlessTrait
+scala> trait PointlessTrait
+defined trait PointlessTrait
-scala> x: Int = 2
+scala> val (x,y) = (2,3)
+x: Int = 2
y: Int = 3
-scala> hello
+scala> println("hello")
+hello
scala>
-scala>
-scala> t1513: Array[Null] = Array(null)
-scala>
-scala> atom: scala.xml.Atom[Unit] = ()
+scala> // ticket #1513
-scala>
-scala> defined class S
+scala> val t1513 = Array(null)
+t1513: Array[Null] = Array(null)
-scala> fish: S = fish
+scala> // ambiguous toString problem from #547
-scala>
-scala> arr: Array[java.lang.String] = Array(What's, up, doc?)
+scala> val atom = new scala.xml.Atom()
+atom: scala.xml.Atom[Unit] = ()
-scala>
-scala> arrInt: Any = Array(1, 2, 3)
+scala> // overriding toString problem from #1404
-scala>
-scala> arrArrInt: Any = Array(Array(1, 2), Array(3, 4))
+scala> class S(override val toString : String)
+defined class S
-scala>
-scala>
-scala> defined class Foo
+scala> val fish = new S("fish")
+fish: S = fish
-scala> defined class Bar
+scala> // Test that arrays pretty print nicely.
-scala> foo2bar: (foo: Foo)Bar
+scala> val arr = Array("What's", "up", "doc?")
+arr: Array[java.lang.String] = Array(What's, up, doc?)
-scala> bar: Bar = Bar(3)
+scala> // Test that arrays pretty print nicely, even when we give them type Any
+
+scala> val arrInt : Any = Array(1,2,3)
+arrInt: Any = Array(1, 2, 3)
+
+scala> // Test that nested arrays are pretty-printed correctly
+
+scala> val arrArrInt : Any = Array(Array(1, 2), Array(3, 4))
+arrArrInt: Any = Array(Array(1, 2), Array(3, 4))
scala>
+
+scala> // implicit conversions
+
+scala> case class Foo(n: Int)
+defined class Foo
+
+scala> case class Bar(n: Int)
+defined class Bar
+
+scala> implicit def foo2bar(foo: Foo) = Bar(foo.n)
+foo2bar: (foo: Foo)Bar
+
+scala> val bar: Bar = Foo(3)
+bar: Bar = Bar(3)
+
scala>
+
+scala> // importing from a previous result
+
scala> import bar._
+import bar._
-scala> m: Int = 3
+scala> val m = n
+m: Int = 3
scala>
-scala>
-scala> one: Int = 1
-scala> one: Int = 1
+scala> // stressing the imports mechanism
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
-scala> one: Int = 1
+scala> val one = 1
+one: Int = 1
+
+scala> val one = 1
+one: Int = 1
+
+scala> val one = 1
+one: Int = 1
scala>
+
scala>
-scala> x1: Int = 1
-scala> x2: Int = 1
+scala> val x1 = 1
+x1: Int = 1
-scala> x3: Int = 1
+scala> val x2 = 1
+x2: Int = 1
-scala> x4: Int = 1
+scala> val x3 = 1
+x3: Int = 1
-scala> x5: Int = 1
+scala> val x4 = 1
+x4: Int = 1
-scala> x6: Int = 1
+scala> val x5 = 1
+x5: Int = 1
-scala> x7: Int = 1
+scala> val x6 = 1
+x6: Int = 1
-scala> x8: Int = 1
+scala> val x7 = 1
+x7: Int = 1
-scala> x9: Int = 1
+scala> val x8 = 1
+x8: Int = 1
-scala> x10: Int = 1
+scala> val x9 = 1
+x9: Int = 1
-scala> x11: Int = 1
+scala> val x10 = 1
+x10: Int = 1
-scala> x12: Int = 1
+scala> val x11 = 1
+x11: Int = 1
-scala> x13: Int = 1
+scala> val x12 = 1
+x12: Int = 1
-scala> x14: Int = 1
+scala> val x13 = 1
+x13: Int = 1
-scala> x15: Int = 1
+scala> val x14 = 1
+x14: Int = 1
-scala> x16: Int = 1
+scala> val x15 = 1
+x15: Int = 1
-scala> x17: Int = 1
+scala> val x16 = 1
+x16: Int = 1
-scala> x18: Int = 1
+scala> val x17 = 1
+x17: Int = 1
-scala> x19: Int = 1
+scala> val x18 = 1
+x18: Int = 1
-scala> x20: Int = 1
+scala> val x19 = 1
+x19: Int = 1
-scala>
-scala> two: Int = 2
+scala> val x20 = 1
+x20: Int = 1
scala>
+
+scala> val two = one + x5
+two: Int = 2
+
scala>
-scala>
-scala> xs: Array[_] = Array(1, 2)
-scala> res2: Int = 2
+scala> // handling generic wildcard arrays (#2386)
-scala> res3: Any = 1
+scala> // It's put here because type feedback is an important part of it.
-scala> res4: Array[_] = Array(2)
+scala> val xs: Array[_] = Array(1, 2)
+xs: Array[_] = Array(1, 2)
-scala> res5: Array[java.lang.String] = Array(abc, abc)
+scala> xs.size
+res2: Int = 2
-scala> res6: scala.collection.mutable.ArraySeq[_] = ArraySeq(1, 2)
+scala> xs.head
+res3: Any = 1
-scala> res7: Array[(_$1, _$1)] forSome { type _$1 } = Array((1,1), (2,2))
+scala> xs filter (_ == 2)
+res4: Array[_] = Array(2)
+
+scala> xs map (_ => "abc")
+res5: Array[java.lang.String] = Array(abc, abc)
+
+scala> xs map (x => x)
+res6: scala.collection.mutable.ArraySeq[_] = ArraySeq(1, 2)
+
+scala> xs map (x => (x, x))
+res7: Array[(_$1, _$1)] forSome { type _$1 } = Array((1,1), (2,2))
scala>
-scala>
-scala>
-scala> <console>:1: error: '=' expected but '=>' found.
+
+scala> // interior syntax errors should *not* go into multi-line input mode.
+
+scala> // both of the following should abort immediately:
+
+scala> def x => y => z
+<console>:1: error: '=' expected but '=>' found.
def x => y => z
^
-scala> <console>:1: error: illegal start of definition
+scala> [1,2,3]
+<console>:1: error: illegal start of definition
[1,2,3]
^
scala>
+
scala>
-scala>
-scala> | | | | res8: scala.xml.Elem =
+
+scala> // multi-line XML
+
+scala> <a>
+<b
+ c="c"
+ d="dd"
+/></a>
+res8: scala.xml.Elem =
<a>
<b c="c" d="dd"></b></a>
scala>
+
scala>
-scala> | | | |
-scala>
+
+scala> /*
+ /*
+ multi-line comment
+ */
+*/
+
scala>
+
scala>
-scala> | | | res9: java.lang.String =
+
+scala> // multi-line string
+
+scala> """
+hello
+there
+"""
+res9: java.lang.String =
"
hello
there
"
scala>
-scala> | | You typed two blank lines. Starting a new command.
-scala>
-scala> match: Int
+scala> (1 + // give up early by typing two blank lines
-scala> x: Int = 1
+
+You typed two blank lines. Starting a new command.
+
+scala> // defining and using quoted names should work (ticket #323)
+
+scala> def `match` = 1
+match: Int
+
+scala> val x = `match`
+x: Int = 1
scala>
-scala>
-scala> defined class Exp
+
+scala> // multiple classes defined on one line
+
+scala> sealed class Exp; class Fact extends Exp; class Term extends Exp
+defined class Exp
defined class Fact
defined class Term
-scala> | | <console>:18: warning: match is not exhaustive!
+scala> def f(e: Exp) = e match { // non-exhaustive warning here
+ case _:Fact => 3
+}
+<console>:18: warning: match is not exhaustive!
missing combination Exp
missing combination Term
@@ -226,6 +364,7 @@ missing combination Term
f: (e: Exp)Int
scala>
+
scala>
plusOne: (x: Int)Int
res0: Int = 6
diff --git a/test/files/jvm/mkLibNatives.bat b/test/files/jvm/mkLibNatives.bat
index 100246af79..e11b6ee21c 100755
--- a/test/files/jvm/mkLibNatives.bat
+++ b/test/files/jvm/mkLibNatives.bat
@@ -4,6 +4,9 @@ rem ##########################################################################
rem # Author : Stephane Micheloud
rem ##########################################################################
+rem # For building the -64.dll, you need: Visual C++ Express, Microsoft SDK (to
+rem # get the 64bit compiler / libraries), adapt this script.
+
rem ##########################################################################
rem # variables
diff --git a/test/files/jvm/natives-64.dll b/test/files/jvm/natives-64.dll
new file mode 100644
index 0000000000..f892f088f5
--- /dev/null
+++ b/test/files/jvm/natives-64.dll
Binary files differ
diff --git a/test/files/neg/annot-nonconst.check b/test/files/neg/annot-nonconst.check
index 385f066baa..e4166e08b6 100644
--- a/test/files/neg/annot-nonconst.check
+++ b/test/files/neg/annot-nonconst.check
@@ -11,7 +11,7 @@ class Ann2(value: String) extends ClassfileAnnotation
annot-nonconst.scala:6: error: annotation argument needs to be a constant; found: n
@Length(n) def foo = "foo"
^
-annot-nonconst.scala:7: error: annotation argument needs to be a constant; found: null
+annot-nonconst.scala:7: error: annotation argument cannot be null
@Ann2(null) def bar = "bar"
^
two warnings found
diff --git a/test/files/neg/bug3736.check b/test/files/neg/bug3736.check
index 8a91088914..cc222d1221 100644
--- a/test/files/neg/bug3736.check
+++ b/test/files/neg/bug3736.check
@@ -1,6 +1,9 @@
bug3736.scala:4: error: super not allowed here: use this.isInstanceOf instead
def f2 = super.isInstanceOf[String]
^
+bug3736.scala:5: error: super not allowed here: use this.asInstanceOf instead
+ def f3 = super.asInstanceOf[AnyRef]
+ ^
bug3736.scala:6: error: super not allowed here: use this.== instead
def f4 = super.==(new AnyRef)
^
@@ -10,4 +13,4 @@ bug3736.scala:7: error: super not allowed here: use this.!= instead
bug3736.scala:8: error: super not allowed here: use this.## instead
def f6 = super.##
^
-four errors found
+5 errors found
diff --git a/test/files/neg/super-cast-or-test.check b/test/files/neg/super-cast-or-test.check
new file mode 100644
index 0000000000..8e5eed62bd
--- /dev/null
+++ b/test/files/neg/super-cast-or-test.check
@@ -0,0 +1,7 @@
+super-cast-or-test.scala:1: error: super not allowed here: use this.asInstanceOf instead
+trait A { def f = super.asInstanceOf[AnyRef] }
+ ^
+super-cast-or-test.scala:2: error: super not allowed here: use this.isInstanceOf instead
+trait B { def g = super.isInstanceOf[AnyRef] }
+ ^
+two errors found
diff --git a/test/files/neg/super-cast-or-test.scala b/test/files/neg/super-cast-or-test.scala
new file mode 100644
index 0000000000..a0f86d8081
--- /dev/null
+++ b/test/files/neg/super-cast-or-test.scala
@@ -0,0 +1,3 @@
+trait A { def f = super.asInstanceOf[AnyRef] }
+trait B { def g = super.isInstanceOf[AnyRef] }
+
diff --git a/test/files/neg/t3399.check b/test/files/neg/t3399.check
index eb6c679704..987da944c6 100644
--- a/test/files/neg/t3399.check
+++ b/test/files/neg/t3399.check
@@ -1,4 +1,4 @@
-t3399.scala:23: error: could not find implicit value for parameter e: =:=[Nats.Add[Nats._1,Nats._1],Nats._1]
+t3399.scala:23: error: Cannot prove that Nats.Add[Nats._1,Nats._1] =:= Nats._1.
implicitly[ Add[_1, _1] =:= _1]
^
one error found
diff --git a/test/files/neg/t3507.check b/test/files/neg/t3507.check
index 1246a20d09..ab38280c1f 100644
--- a/test/files/neg/t3507.check
+++ b/test/files/neg/t3507.check
@@ -1,4 +1,4 @@
-t3507.scala:13: error: could not find implicit value for evidence parameter of type Manifest[object _1.b.c]
+t3507.scala:13: error: No Manifest available for object _1.b.c.
mani/*[object _1.b.c]*/(c) // kaboom in manifestOfType / TreeGen.mkAttributedQualifier
^
one error found
diff --git a/test/files/neg/t4431.check b/test/files/neg/t4431.check
new file mode 100644
index 0000000000..7896ec1a62
--- /dev/null
+++ b/test/files/neg/t4431.check
@@ -0,0 +1,7 @@
+t4431.scala:5: error: class BB needs to be abstract, since there is a deferred declaration of method f which is not implemented in a subclass
+ class BB extends B { def f (): Unit }
+ ^
+t4431.scala:8: error: trait cannot redefine final method from class AnyRef
+ trait C { def wait (): Unit }
+ ^
+two errors found
diff --git a/test/files/neg/t4431.scala b/test/files/neg/t4431.scala
new file mode 100644
index 0000000000..5fbb239e04
--- /dev/null
+++ b/test/files/neg/t4431.scala
@@ -0,0 +1,16 @@
+object Test {
+ // this works.
+ class B { final def f(): Unit = () }
+ trait A extends B { def f (): Unit }
+ class BB extends B { def f (): Unit }
+
+ // this earns a VerifyError.
+ trait C { def wait (): Unit }
+ class D { }
+
+ def main(args: Array[String]): Unit = {
+ new B with A { }
+ new BB
+// new D with C { }
+ }
+}
diff --git a/test/files/pos/javaReadsSigs/fromjava.java b/test/files/pos/javaReadsSigs/fromjava.java
index d31244bb95..745fb84efd 100644
--- a/test/files/pos/javaReadsSigs/fromjava.java
+++ b/test/files/pos/javaReadsSigs/fromjava.java
@@ -1,16 +1,75 @@
+import scala.*;
+import scala.math.Ordering;
+import scala.math.Numeric;
+import scala.collection.Seq;
+import scala.collection.Traversable;
+import scala.collection.Traversable$;
+import scala.collection.immutable.Set;
+import scala.collection.immutable.HashSet;
+import scala.collection.immutable.Map;
+import scala.collection.immutable.Map$;
+import scala.collection.immutable.HashMap;
import scala.collection.immutable.Vector;
import scala.collection.immutable.List;
+import scala.collection.generic.CanBuildFrom;
-public class fromjava {
+class A { };
+class B { };
+
+// This one compiles but it would be better if it didn't.
+// Checking in under pos anyway in the interests of making sure
+// we are informed if the status changes.
+class Contra {
+ // Not an Ordering<Character>.
+ static Ordering<Object> charOrd = scala.math.Ordering$Char$.MODULE$;
+
+ public boolean useCharOrd() {
+ return charOrd.compare(new Object(), new Object()) == 0;
+ }
+
+ static Numeric<?> intNum = scala.math.Numeric$IntIsIntegral$.MODULE$;
+}
- void main(String[] args, Vector<String> x) {
- Vector<String> y = x.take(2);
- String h = y.head();
- System.out.println(h);
+public class fromjava {
+ public static Function1<A, B> f1 = new scala.runtime.AbstractFunction1<A, B>() {
+ public B apply(A a) {
+ return null;
}
- void main(String[] args, List<String> x) {
- List<String> y = x.drop(2);
- String h = y.head();
- System.out.println(h);
+ };
+
+ public static Function1<Tuple2<? extends Object, B>, B> f2 = new scala.runtime.AbstractFunction1<Tuple2<? extends Object, B>, B>() {
+ public B apply(Tuple2<? extends Object, B> tup) {
+ return tup._2();
}
+ };
+
+ public static String vector(Vector<String> x) {
+ Vector<String> y = x.take(2);
+ return y.head();
+ }
+ public static String list(List<String> x) {
+ List<String> y = x.drop(2);
+ return y.head();
+ }
+ public static Tuple2<String, Integer> map(Map<String, Integer> x) {
+ Traversable<Tuple2<String, Integer>> y = x.drop(2);
+ return y.head();
+ }
+ public static <T> Object sum(Traversable<T> x) {
+ return x.sum(Contra.intNum);
+ }
+ // Looks like sum as given below fails under java5, so disabled.
+ //
+ // [partest] testing: [...]/files/pos/javaReadsSigs [FAILED]
+ // [partest] files/pos/javaReadsSigs/fromjava.java:62: name clash: sum(scala.collection.Traversable<A>) and <T>sum(scala.collection.Traversable<T>) have the same erasure
+ // [partest] public static B sum(Traversable<A> x) {
+ // [partest] ^
+ //
+ //
+ // can't make this work with an actual CanBuildFrom: see #4389.
+ // public static B sum(Traversable<A> x) {
+ // // have to cast it unfortunately: map in TraversableLike returns
+ // // "That" and such types seem to be signature poison.
+ // return ((Traversable<B>)x.map(f1, null)).head();
+ // }
} \ No newline at end of file
diff --git a/test/files/presentation/find-trees.check b/test/files/presentation/find-trees.check
index 33213dd911..9f60d4fb52 100644
--- a/test/files/presentation/find-trees.check
+++ b/test/files/presentation/find-trees.check
@@ -3,4 +3,4 @@ asking position at 19:4
retrieved tree: InteractiveTest.this.settings
====================
asking position at 20:16
-retrieved tree: lazy private[this] var compiler: scala.tools.nsc.interactive.CompilerControl = new Global(InteractiveTest.this.settings, InteractiveTest.this.reporter)
+retrieved tree: lazy private[this] var compiler: scala.tools.nsc.interactive.CompilerControl = new Global(InteractiveTest.this.settings, InteractiveTest.this.reporter, interactive.this.Global.init$default$3)
diff --git a/test/files/run/bug3376.check b/test/files/run/bug3376.check
index 7286096022..3a1d7d581b 100644
--- a/test/files/run/bug3376.check
+++ b/test/files/run/bug3376.check
@@ -2,12 +2,17 @@ Type in expressions to have them evaluated.
Type :help for more information.
scala>
-scala> defined class M
-scala> m1: M[Int] = mmm
+scala> class M[@specialized T] { override def toString = "mmm" }
+defined class M
-scala> m2: M[Float] = mmm
+scala> val m1 = new M[Int]()
+m1: M[Int] = mmm
-scala> m3: M[String] = mmm
+scala> val m2 = new M[Float]()
+m2: M[Float] = mmm
+
+scala> val m3 = new M[String]()
+m3: M[String] = mmm
scala>
diff --git a/test/files/run/bug4080.check b/test/files/run/bug4080.check
new file mode 100644
index 0000000000..66ce31bb43
--- /dev/null
+++ b/test/files/run/bug4080.check
@@ -0,0 +1 @@
+LinkedList(1, 0, 2, 3)
diff --git a/test/files/run/bug4080.scala b/test/files/run/bug4080.scala
new file mode 100644
index 0000000000..92740ed776
--- /dev/null
+++ b/test/files/run/bug4080.scala
@@ -0,0 +1,12 @@
+import scala.collection.mutable.LinkedList
+
+object Test {
+ def main(args: Array[String]) {
+ val ll = LinkedList(1, 2, 3)
+ ll.insert(LinkedList(0))
+ println(ll)
+ val ll2 = LinkedList[Int]()
+ try println(ll2.head)
+ catch { case _ => () }
+ }
+}
diff --git a/test/files/run/bug4285.check b/test/files/run/bug4285.check
index 5a3c9811c3..84f8929e43 100644
--- a/test/files/run/bug4285.check
+++ b/test/files/run/bug4285.check
@@ -2,11 +2,16 @@ Type in expressions to have them evaluated.
Type :help for more information.
scala>
-scala> x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7)
-scala> y: scala.collection.mutable.WrappedArray[Int] = WrappedArray(2, 4, 6, 8, 10, 12, 14)
+scala> val x = Array(1,2,3,4,5,6,7)
+x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7)
-scala> 56
+scala> val y = x transform (_ * 2)
+y: scala.collection.mutable.WrappedArray[Int] = WrappedArray(2, 4, 6, 8, 10, 12, 14)
+
+scala> println(y.sum)
+56
scala>
+
scala>
diff --git a/test/files/run/bug4387.scala b/test/files/run/bug4387.scala
new file mode 100644
index 0000000000..f51c9b0572
--- /dev/null
+++ b/test/files/run/bug4387.scala
@@ -0,0 +1,12 @@
+object Test {
+ import xml.XML.loadString
+ def mkElem(arg: String) = <foo a="1" b="2" c="3" d="4" e={arg} />
+
+ val x1 = mkElem("5")
+ val x2 = mkElem("50")
+
+ def main(args: Array[String]): Unit = {
+ assert(x1 == loadString("" + x1))
+ assert(x2 != loadString("" + x1))
+ }
+}
diff --git a/test/files/run/constrained-types.check b/test/files/run/constrained-types.check
index e22e3a58d5..6919eca9bc 100644
--- a/test/files/run/constrained-types.check
+++ b/test/files/run/constrained-types.check
@@ -1,102 +1,110 @@
-class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint
+Type in expressions to have them evaluated.
+Type :help for more information.
+
+scala>
+
+scala>
+
+scala> class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint
defined class Annot
------
-class A {
+scala>
+
+scala> class A {
val x = "hello"
val y: Int @Annot(x) = 10
override def toString = "an A"
}
defined class A
------
-val a = new A
+scala>
+
+scala> val a = new A
a: A = an A
------
-val y = a.y // should rewrite "this.x" to "a.x"
+scala> val y = a.y // should rewrite "this.x" to "a.x"
y: Int @Annot(a.x) = 10
------
-var a2 = new A
+scala> var a2 = new A
a2: A = an A
------
-val y2 = a2.y // should drop the annotation
+scala> val y2 = a2.y // should drop the annotation
y2: Int = 10
------
-object Stuff {
+scala>
+
+scala> object Stuff {
val x = "hello"
val y : Int @Annot(x) = 10
}
defined module Stuff
------
-val y = Stuff.y // should rewrite the annotation
+scala>
+
+scala> val y = Stuff.y // should rewrite the annotation
y: Int @Annot(Stuff.x) = 10
------
-class B {
+scala>
+
+scala> class B {
val y: Int @Annot(Stuff.x) = 10
override def toString = "a B"
}
defined class B
------
-val b = new B
+scala>
+
+scala> val b = new B
b: B = a B
------
-val y = b.y // should keep the annotation
+scala> val y = b.y // should keep the annotation
y: Int @Annot(Stuff.x) = 10
------
-def m(x: String): String @Annot(x) = x
+scala> def m(x: String): String @Annot(x) = x
m: (x: String)String @Annot(x)
------
-val three = "three"
+scala>
+
+scala> val three = "three"
three: java.lang.String = three
------
-val three2 = m(three:three.type) // should change x to three
+scala> val three2 = m(three:three.type) // should change x to three
three2: String @Annot(three) = three
------
-var four = "four"
+scala> var four = "four"
four: java.lang.String = four
------
-val four2 = m(four) // should have an existential bound
+scala> val four2 = m(four) // should have an existential bound
four2: java.lang.String @Annot(x) forSome { val x: java.lang.String } = four
------
-val four3 = four2 // should have the same type as four2
+scala> val four3 = four2 // should have the same type as four2
four3: java.lang.String @Annot(x) forSome { val x: java.lang.String } = four
------
-val stuff = m("stuff") // should not crash
+scala> val stuff = m("stuff") // should not crash
stuff: String @Annot("stuff") = stuff
------
-class peer extends annotation.Annotation // should not crash
+scala>
+
+scala> class peer extends annotation.Annotation // should not crash
defined class peer
------
-class NPE[T <: NPE[T] @peer] // should not crash
+scala>
+
+scala> class NPE[T <: NPE[T] @peer] // should not crash
defined class NPE
------
-def m = {
+scala>
+
+scala> def m = {
val x = "three"
val y : String @Annot(x) = x
y
} // x should not escape the local scope with a narrow type
m: String @Annot("three")
------
-def n(y: String) = {
+scala>
+
+scala> def n(y: String) = {
def m(x: String) : String @Annot(x) = {
(if (x == "")
m("default")
@@ -107,30 +115,40 @@ def n(y: String) = {
} // x should be existentially bound
n: (y: String)java.lang.String @Annot(x) forSome { val x: String }
------
-class rep extends annotation.Annotation
+scala>
+
+scala> class rep extends annotation.Annotation { }
defined class rep
------
-object A { val x = "hello" : String @ rep }
+scala>
+
+scala> object A { val x = "hello" : String @ rep }
defined module A
+warning: previously defined class A is not a companion to object A.
+Companions must be defined together; you may wish to use :paste mode for this.
------
-val y = a.x // should drop the annotation
+scala>
+
+scala> val y = a.x // should drop the annotation
y: java.lang.String = hello
------
-val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message
+scala>
+
+scala> val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
<console>:8: error: not found: value e
- val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message
+ val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
^
------
-class Where(condition: Boolean) extends annotation.Annotation
+scala>
+
+scala> class Where(condition: Boolean) extends annotation.Annotation
defined class Where
------
-val x : Int @Where(self > 0 && self < 100) = 3
+scala>
+
+scala> val x : Int @Where(self > 0 && self < 100) = 3
x: Int @Where(self.>(0).&&(self.<(100))) = 3
------
+scala>
+
+scala>
diff --git a/test/files/run/constrained-types.scala b/test/files/run/constrained-types.scala
index 86fcaade6e..5f7eb7adde 100644
--- a/test/files/run/constrained-types.scala
+++ b/test/files/run/constrained-types.scala
@@ -3,103 +3,91 @@
* of DeBruijn's . It runs the test using the interpreter so that
* the resulting annotated types can be printed out.
*/
-import scala.tools.nsc._
-import java.io._
-import scala.Console
+import scala.tools.nsc.Settings
+import scala.tools.partest.ReplTest
-object Test {
+object Test extends ReplTest {
+ def code = """
- val testCode = List(
- "class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint",
+class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint
- """class A {
- | val x = "hello"
- | val y: Int @Annot(x) = 10
- | override def toString = "an A"
- |} """,
-
-
-
- "val a = new A",
-
- """val y = a.y // should rewrite "this.x" to "a.x" """,
-
-
- "var a2 = new A",
- "val y2 = a2.y // should drop the annotation",
-
-
- """object Stuff {
- | val x = "hello"
- | val y : Int @Annot(x) = 10
- |}""",
-
- "val y = Stuff.y // should rewrite the annotation",
+class A {
+ val x = "hello"
+ val y: Int @Annot(x) = 10
+ override def toString = "an A"
+}
- """class B {
- | val y: Int @Annot(Stuff.x) = 10
- | override def toString = "a B"
- |}""",
+val a = new A
+val y = a.y // should rewrite "this.x" to "a.x"
+var a2 = new A
+val y2 = a2.y // should drop the annotation
- "val b = new B",
- "val y = b.y // should keep the annotation",
+object Stuff {
+ val x = "hello"
+ val y : Int @Annot(x) = 10
+}
+val y = Stuff.y // should rewrite the annotation
- "def m(x: String): String @Annot(x) = x",
- "val three = \"three\"",
- "val three2 = m(three:three.type) // should change x to three",
- "var four = \"four\"",
- "val four2 = m(four) // should have an existential bound",
- "val four3 = four2 // should have the same type as four2",
+class B {
+ val y: Int @Annot(Stuff.x) = 10
+ override def toString = "a B"
+}
- """val stuff = m("stuff") // should not crash""",
+val b = new B
+val y = b.y // should keep the annotation
+def m(x: String): String @Annot(x) = x
+
+val three = "three"
+val three2 = m(three:three.type) // should change x to three
+var four = "four"
+val four2 = m(four) // should have an existential bound
+val four3 = four2 // should have the same type as four2
+val stuff = m("stuff") // should not crash
+
+class peer extends annotation.Annotation // should not crash
+
+class NPE[T <: NPE[T] @peer] // should not crash
+
+def m = {
+ val x = "three"
+ val y : String @Annot(x) = x
+ y
+} // x should not escape the local scope with a narrow type
+
+def n(y: String) = {
+ def m(x: String) : String @Annot(x) = {
+ (if (x == "")
+ m("default")
+ else
+ x)
+ }
+ m("stuff".stripMargin)
+} // x should be existentially bound
- """class peer extends annotation.Annotation // should not crash""", // reported by Manfred Stock
- """class NPE[T <: NPE[T] @peer] // should not crash""", // reported by Manfred Stock
+class rep extends annotation.Annotation { }
- """def m = {
- | val x = "three"
- | val y : String @Annot(x) = x
- | y
- |} // x should not escape the local scope with a narrow type""",
+object A { val x = "hello" : String @ rep }
- """def n(y: String) = {
- | def m(x: String) : String @Annot(x) = {
- | (if (x == "")
- | m("default")
- | else
- | x)
- | }
- | m("stuff".stripMargin)
- |} // x should be existentially bound""",
+val y = a.x // should drop the annotation
- "class rep extends annotation.Annotation",
- """object A { val x = "hello" : String @ rep }""",
- "val y = a.x // should drop the annotation",
+val x = 3 : Int @Annot(e+f+g+h) // should have a graceful error message
- "val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message",
+class Where(condition: Boolean) extends annotation.Annotation
- "class Where(condition: Boolean) extends annotation.Annotation",
- "val x : Int @Where(self > 0 && self < 100) = 3"
- ).map(_.stripMargin)
+val x : Int @Where(self > 0 && self < 100) = 3
+"""
+ override def settings: Settings = {
+ val s = new Settings
- def main(args: Array[String]) {
- val settings = new Settings
- settings.Xexperimental.value = true
- settings.selfInAnnots.value = true
- settings.deprecation.value = true
+ s.Xexperimental.value = true
+ s.selfInAnnots.value = true
+ s.deprecation.value = true
// when running that compiler, give it a scala-library to the classpath
- settings.classpath.value = System.getProperty("java.class.path")
-
- val interp = new Interpreter(settings)
+ s.classpath.value = sys.props("java.class.path")
- for (cmd <- testCode) {
- println(cmd)
- interp.interpret(cmd)
- println()
- println("-----")
- }
+ s
}
}
diff --git a/test/files/run/programmatic-main.scala b/test/files/run/programmatic-main.scala
index 3a88252fd3..7fec0f3f98 100644
--- a/test/files/run/programmatic-main.scala
+++ b/test/files/run/programmatic-main.scala
@@ -8,7 +8,7 @@ object Test {
def main(args: Array[String]): Unit = {
Console.withErr(Console.out) {
- Main process (baseargs ++ Array("-Xshow-phases"))
+ Main process (baseargs ++ "-Xpluginsdir /does/not/exist/foo/quux -Xshow-phases".split(' '))
}
}
}
diff --git a/test/files/run/repl-assign.check b/test/files/run/repl-assign.check
new file mode 100644
index 0000000000..c6b0458f04
--- /dev/null
+++ b/test/files/run/repl-assign.check
@@ -0,0 +1,20 @@
+Type in expressions to have them evaluated.
+Type :help for more information.
+
+scala>
+
+scala> var x = 10
+x: Int = 10
+
+scala> var y = 11
+y: Int = 11
+
+scala> x = 12
+x: Int = 12
+
+scala> y = 13
+y: Int = 13
+
+scala>
+
+scala>
diff --git a/test/files/run/repl-assign.scala b/test/files/run/repl-assign.scala
new file mode 100644
index 0000000000..ee3c1649d8
--- /dev/null
+++ b/test/files/run/repl-assign.scala
@@ -0,0 +1,10 @@
+import scala.tools.partest.ReplTest
+
+object Test extends ReplTest {
+ def code = """
+var x = 10
+var y = 11
+x = 12
+y = 13
+ """
+} \ No newline at end of file
diff --git a/test/files/run/repl-paste-2.check b/test/files/run/repl-paste-2.check
index fb7a818f1a..435592567d 100644
--- a/test/files/run/repl-paste-2.check
+++ b/test/files/run/repl-paste-2.check
@@ -2,30 +2,60 @@ Type in expressions to have them evaluated.
Type :help for more information.
scala>
-scala> // Replaying 7 commands from transcript.
-val res0 = { 123 }
-res0: Int = 123
+scala> scala> 0123
+res4: Int = 0123
-val res1 = { 567 }
-res1: Int = 567
+scala> 123
+res5: Int = 123
-val res2 = { res0 + res1 }
-res2: Int = 690
+scala> 567
+res6: Int = 567
-val x = dingus
+scala> res5 + res6
+res7: Int = 690
+
+scala> val x = dingus
+<console>:7: error: not found: value dingus
+ val x = dingus
+ ^
+
+scala> val x = "dingus"
+x: java.lang.String = dingus
+
+scala> x.length
+res9: Int = 6
+
+scala> x.length + res5
+res10: Int = 12
+
+// Replaying 8 commands from transcript.
+
+scala> 0123
+res0: Int = 83
+
+scala> val res5 = { 123 }
+res5: Int = 123
+
+scala> val res6 = { 567 }
+res6: Int = 567
+
+scala> res5 + res6
+res1: Int = 690
+
+scala> val x = dingus
<console>:7: error: not found: value dingus
val x = dingus
^
-val x = "dingus"
+scala> val x = "dingus"
x: java.lang.String = dingus
-val res3 = { x.length }
-res3: Int = 6
+scala> x.length
+res2: Int = 6
-val res4 = { x.length + res3 }
-res4: Int = 12
+scala> x.length + res5
+res3: Int = 129
scala>
diff --git a/test/files/run/repl-paste-2.scala b/test/files/run/repl-paste-2.scala
index 802c627701..f62927791d 100644
--- a/test/files/run/repl-paste-2.scala
+++ b/test/files/run/repl-paste-2.scala
@@ -2,14 +2,17 @@ import scala.tools.partest.ReplTest
object Test extends ReplTest {
def code = """
+scala> 0123
+res4: Int = 0123
+
scala> 123
-res0: Int = 123
+res5: Int = 123
scala> 567
-res1: Int = 567
+res6: Int = 567
-scala> res0 + res1
-res2: Int = 690
+scala> res5 + res6
+res7: Int = 690
scala> val x = dingus
<console>:7: error: not found: value dingus
@@ -20,9 +23,9 @@ scala> val x = "dingus"
x: java.lang.String = dingus
scala> x.length
-res3: Int = 6
+res9: Int = 6
-scala> x.length + res3
-res4: Int = 12
+scala> x.length + res5
+res10: Int = 12
"""
} \ No newline at end of file
diff --git a/test/files/run/repl-paste.check b/test/files/run/repl-paste.check
index 4c9de85e67..50589433cd 100644
--- a/test/files/run/repl-paste.check
+++ b/test/files/run/repl-paste.check
@@ -1,7 +1,21 @@
Type in expressions to have them evaluated.
Type :help for more information.
-scala> // Entering paste mode (ctrl-D to finish)
+scala> :paste
+// Entering paste mode (ctrl-D to finish)
+
+
+ class Dingus
+ {
+ private val x = 5
+ def y = Dingus.x * 2
+ }
+ object Dingus
+ {
+ private val x = 55
+ }
+
+ val x = (new Dingus).y
// Exiting paste mode, now interpreting.
diff --git a/test/files/run/repl-transcript.check b/test/files/run/repl-transcript.check
index b2a8d2e156..03162451b6 100644
--- a/test/files/run/repl-transcript.check
+++ b/test/files/run/repl-transcript.check
@@ -2,21 +2,36 @@ Type in expressions to have them evaluated.
Type :help for more information.
scala>
-scala> // Replaying 5 commands from transcript.
-class Bippity
+scala> scala> class Bippity
defined class Bippity
-def f = new Bippity
+scala> def f = new Bippity
f: Bippity
-val res5 = { 123 }
+scala> 123
res5: Int = 123
-val res6 = { 1 to 100 map (_ + 1) }
+scala> 1 to 100 map (_ + 1)
res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101)
-res6.sum + res5
+scala> res6.sum + res5
+
+// Replaying 5 commands from transcript.
+
+scala> class Bippity
+defined class Bippity
+
+scala> def f = new Bippity
+f: Bippity
+
+scala> val res5 = { 123 }
+res5: Int = 123
+
+scala> val res6 = { 1 to 100 map (_ + 1) }
+res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101)
+
+scala> res6.sum + res5
res0: Int = 5273
diff --git a/test/files/run/t3361.scala b/test/files/run/t3361.scala
index 17af89a67c..892e36dbd9 100644
--- a/test/files/run/t3361.scala
+++ b/test/files/run/t3361.scala
@@ -39,10 +39,8 @@ object Test extends App {
def insert_1 {
val ten = DoubleLinkedList(1 to 10: _*)
- ten.insert(DoubleLinkedList(11)) match {
- case _: Unit => require(true)
- case _ => require(false)
- }
+ ten.append(DoubleLinkedList(11))
+
// Post-insert size test
require(11 == ten.size)
// Post-insert data test
diff --git a/test/files/run/t4396.check b/test/files/run/t4396.check
new file mode 100644
index 0000000000..58f4fc5138
--- /dev/null
+++ b/test/files/run/t4396.check
@@ -0,0 +1,5 @@
+hallo
+constructor
+out:22
+bye
+foo
diff --git a/test/files/run/t4396.scala b/test/files/run/t4396.scala
new file mode 100644
index 0000000000..d67eaa378e
--- /dev/null
+++ b/test/files/run/t4396.scala
@@ -0,0 +1,35 @@
+// #43896
+trait M extends DelayedInit {
+ def delayedInit(body : => Unit) {
+ println("hallo")
+ body
+ println("bye")
+ }
+}
+
+class C(init : Int) extends M {
+ def foo = init
+ println("constructor")
+ var x = init
+ println("out:"+x)
+}
+
+// #4380
+object Main {
+ def main(argv: Array[String]) {
+ class Bip {
+ class Foo { override def toString() = "foo" }
+ object Main extends App {
+ val cbn = new Foo()
+ }
+ Main.main(Array())
+ println(Main.cbn)
+ }
+ new Bip
+ }
+}
+
+object Test extends App {
+ new C(22)
+ Main.main(Array())
+}
diff --git a/test/files/run/treePrint.scala b/test/files/run/treePrint.scala
index ce7dd04499..452aaf390d 100644
--- a/test/files/run/treePrint.scala
+++ b/test/files/run/treePrint.scala
@@ -35,7 +35,7 @@ object Test {
settings.Ycompacttrees.value = true
val intp = new IMain(settings, new PrintWriter(new NullOutputStream))
- val power = new Power(intp)
+ val power = Power(intp)
intp.interpret("""def initialize = "Have to interpret something or we get errors." """)
power trees code foreach println
}
diff --git a/test/partest b/test/partest
index 5f89588d1f..44f7130968 100755
--- a/test/partest
+++ b/test/partest
@@ -74,8 +74,7 @@ if $cygwin; then
EXT_CLASSPATH=`cygpath --path --$format "$EXT_CLASSPATH"`
fi
-# Reminder: substitution ${JAVA_OPTS:=-Xmx256M -Xms16M} DO NOT work on Solaris
-[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx512M -Xms16M"
+[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx1024M -Xms16M"
[ -n "$SCALAC_OPTS" ] || SCALAC_OPTS="-deprecation"
partestDebugStr=""
diff --git a/test/scaladoc/resources/Trac3484.scala b/test/scaladoc/resources/Trac3484.scala
new file mode 100644
index 0000000000..9656ec268d
--- /dev/null
+++ b/test/scaladoc/resources/Trac3484.scala
@@ -0,0 +1,27 @@
+class cbf[A, B, C]
+
+/**
+ * @define Coll Traversable
+ * @define bfreturn $Coll
+ */
+class Collection[A] {
+ /** What map does...
+ *
+ * $bfreturn
+ * @usecase def map[B](f: A => B): $bfreturn[B]
+ *
+ */
+ def map[B, That](f: A => B)(implicit fact: cbf[Collection[A], B, That]) =
+ null
+}
+
+/**
+ * @define b John
+ * @define a Mister $b
+ */
+class SR704 {
+ /**
+ * Hello $a.
+ */
+ def foo = 123
+}
diff --git a/test/scaladoc/resources/Trac4180.scala b/test/scaladoc/resources/Trac4180.scala
new file mode 100644
index 0000000000..3d6922803b
--- /dev/null
+++ b/test/scaladoc/resources/Trac4180.scala
@@ -0,0 +1,4 @@
+trait Trac4180 {
+ type A
+ object A
+}
diff --git a/test/scaladoc/resources/Trac4289.scala b/test/scaladoc/resources/Trac4289.scala
new file mode 100644
index 0000000000..1644e18bd4
--- /dev/null
+++ b/test/scaladoc/resources/Trac4289.scala
@@ -0,0 +1,13 @@
+class Superclass {
+ /**
+ * @return 123
+ */
+ def foo = 123
+}
+
+class Subclass extends Superclass {
+ /**
+ * hello
+ */
+ override def foo = 456
+}
diff --git a/test/scaladoc/resources/Trac4325.scala b/test/scaladoc/resources/Trac4325.scala
new file mode 100644
index 0000000000..ffb968d571
--- /dev/null
+++ b/test/scaladoc/resources/Trac4325.scala
@@ -0,0 +1,5 @@
+case class WithSynthetic
+
+case class WithObject
+object WithObject
+
diff --git a/test/scaladoc/resources/Trac4358.scala b/test/scaladoc/resources/Trac4358.scala
new file mode 100644
index 0000000000..961c82160e
--- /dev/null
+++ b/test/scaladoc/resources/Trac4358.scala
@@ -0,0 +1,8 @@
+trait Trac4358 {
+ /**
+ * Implicit conversion that invokes the <code>expect</code> method on the <code>EasyMock</code> companion object (<em>i.e.</em>, the
+ * static <code>expect</code> method in Java class <code>org.easymock.EasyMock</code>).
+ *
+ */
+ val foo = 123
+}
diff --git a/test/scaladoc/resources/Trac4372.scala b/test/scaladoc/resources/Trac4372.scala
new file mode 100644
index 0000000000..03da659eee
--- /dev/null
+++ b/test/scaladoc/resources/Trac4372.scala
@@ -0,0 +1,5 @@
+class Trac4372 {
+ def method(n: Int) = n
+ def +:(n: Int) = n
+ val -: = 1
+}
diff --git a/test/scaladoc/resources/Trac4374.scala b/test/scaladoc/resources/Trac4374.scala
new file mode 100644
index 0000000000..4dd8ba2ae8
--- /dev/null
+++ b/test/scaladoc/resources/Trac4374.scala
@@ -0,0 +1,5 @@
+class WithPublic
+object WithPublic
+
+class WithPrivate
+private object WithPrivate
diff --git a/test/scaladoc/resources/Trac4409.scala b/test/scaladoc/resources/Trac4409.scala
new file mode 100644
index 0000000000..f93d3e238e
--- /dev/null
+++ b/test/scaladoc/resources/Trac4409.scala
@@ -0,0 +1,14 @@
+/**
+ * @define xxx
+ *
+ * The value of xxx don't contain since tag.
+ *
+ * @since 1.0
+ */
+
+class Trac4409 {
+ /**
+ * $xxx
+ */
+ def foo = 123
+}
diff --git a/test/scaladoc/resources/Trac4420.scala b/test/scaladoc/resources/Trac4420.scala
new file mode 100644
index 0000000000..dbe053f3da
--- /dev/null
+++ b/test/scaladoc/resources/Trac4420.scala
@@ -0,0 +1,14 @@
+import java.io.File
+
+/**
+ * @define PP This class is an instance of XXX so it's members are not called directly.
+ * Instead these classes are instantiated via a driver's ''process''. See YYY for more details. */
+abstract class test
+
+/**
+ * TestA class
+ *
+ * this is a description.
+ *
+ * $PP */
+class TestA extends test
diff --git a/test/scaladoc/resources/Trac484.scala b/test/scaladoc/resources/Trac484.scala
new file mode 100644
index 0000000000..b4f81ae172
--- /dev/null
+++ b/test/scaladoc/resources/Trac484.scala
@@ -0,0 +1,18 @@
+class RefinementAndExistentials {
+ type Foo = {
+ type Dingus
+ def bippy(x: Int): String
+ def dingus(): String
+ }
+ type Bar = {
+ type Dingus <: T forSome { type T <: String }
+ }
+ def f(x: Foo) = 51
+ def g(x: T forSome { type T <: String }) = x
+ def h(x: Float): { def quux(x: Int, y: Int): Int } = new {
+ def quux(x: Int, y: Int) = 55
+ }
+ def hh(x: Float) = new { def quux(x: Int, y: Int) = 55 }
+ def j(x: Int): Bar = sys.error("")
+ def k(): AnyRef { type Dingus <: T forSome { type T <: String } } = sys.error("")
+}
diff --git a/test/scaladoc/scala/html/HtmlFactoryTest.scala b/test/scaladoc/scala/html/HtmlFactoryTest.scala
index ecdbb3cf46..c0a3f1ad95 100644
--- a/test/scaladoc/scala/html/HtmlFactoryTest.scala
+++ b/test/scaladoc/scala/html/HtmlFactoryTest.scala
@@ -18,23 +18,6 @@ object XMLUtil {
case _ => seq
}
}
-
- def attributeIs(key: String, value: String) = {
- (element: Node) => {
- element.attribute(key) match {
- case Some(v) =>
- v.toString == value
- case _ =>
- false
- }
- }
- }
-
- def textIs(value: String) = {
- (node: Node) => {
- node.descendant.exists((n) => n.toString.trim == value)
- }
- }
}
object Test extends Properties("HtmlFactory") {
@@ -52,18 +35,18 @@ object Test extends Properties("HtmlFactory") {
(paths ++ morepaths).mkString(java.io.File.pathSeparator)
}
- def createTemplates(basename: String) = {
- val result = scala.collection.mutable.Map[String, scala.xml.NodeSeq]()
+ def createFactory = {
+ val settings = new Settings({Console.err.println(_)})
+ settings.classpath.value = getClasspath
- val factory = {
- val settings = new Settings({Console.err.println(_)})
- settings.classpath.value = getClasspath
+ val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings)
+ new DocFactory(reporter, settings)
+ }
- val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings)
- new DocFactory(reporter, settings)
- }
+ def createTemplates(basename: String) = {
+ val result = scala.collection.mutable.Map[String, scala.xml.NodeSeq]()
- factory.makeUniverse(List("test/scaladoc/resources/"+basename)) match {
+ createFactory.makeUniverse(List("test/scaladoc/resources/"+basename)) match {
case Some(universe) => {
val index = IndexModelFactory.makeIndex(universe)
(new HtmlFactory(universe, index)).writeTemplates((page) => {
@@ -76,19 +59,30 @@ object Test extends Properties("HtmlFactory") {
result
}
- property("Trac #3790") = {
- import XMLUtil._
+ def createTemplate(scala: String) = {
+ val html = scala.stripSuffix(".scala") + ".html"
+ createTemplates(scala)(html)
+ }
- val files = createTemplates("Trac3790.scala")
- files("Trac3790.html") match {
+ def shortComments(root: scala.xml.Node) =
+ XMLUtil.stripGroup(root).descendant.flatMap {
+ case e: scala.xml.Elem => {
+ if (e.attribute("class").toString.contains("shortcomment")) {
+ Some(e)
+ } else {
+ None
+ }
+ }
+ case _ => None
+ }
+
+ property("Trac #3790") = {
+ createTemplate("Trac3790.scala") match {
case node: scala.xml.Node => {
- val comments = (stripGroup(node) \\ "div").flatMap {
- case e: scala.xml.Elem => Some(e)
- case _ => None
- }.filter { attributeIs("class", "fullcomment")(_) }
+ val comments = shortComments(node)
- comments.filter(textIs("A lazy String")(_)).length == 1 &&
- comments.filter(textIs("A non-lazy String")(_)).length == 1
+ comments.exists { _.toString.contains(">A lazy String\n</p>") } &&
+ comments.exists { _.toString.contains(">A non-lazy String\n</p>") }
}
case _ => false
}
@@ -100,28 +94,176 @@ object Test extends Properties("HtmlFactory") {
}
property("Trac #4366") = {
- val files = createTemplates("Trac4366.scala")
- files("Trac4366.html") match {
+ createTemplate("Trac4366.scala") match {
case node: scala.xml.Node => {
- val comments = XMLUtil.stripGroup(node).descendant.flatMap {
- case e: scala.xml.Elem => {
- if (e.attribute("class").toString.contains("shortcomment")) {
- Some(e)
- } else {
- None
- }
- }
- case _ => None
+ shortComments(node).exists { n => {
+ val str = n.toString
+ str.contains("<code>foo</code>") && str.contains("</strong>")
+ } }
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4358") = {
+ createTemplate("Trac4358.scala") match {
+ case node: scala.xml.Node =>
+ ! shortComments(node).exists {
+ _.toString.contains("<em>i.</em>")
}
+ case _ => false
+ }
+ }
+
+ property("Trac #4180") = {
+ createTemplate("Trac4180.scala") != None
+ }
- comments.exists {
- (e) => {
- val s = e.toString
- s.contains("<code>foo</code>") && s.contains("</strong>")
- }
+ property("Trac #4372") = {
+ createTemplate("Trac4372.scala") match {
+ case node: scala.xml.Node => {
+ val html = node.toString
+ html.contains("<span class=\"name\">+:</span>\n") &&
+ html.contains("<span class=\"name\">-:</span>\n") &&
+ html.contains("""<span class="params">(<span name="n">n: <span name="scala.Int" class="extype">Int</span></span>)</span><span class="result">: <span name="scala.Int" class="extype">Int</span></span>""")
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4374 - public") = {
+ val files = createTemplates("Trac4374.scala")
+ files("WithPublic.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ s.contains("""href="WithPublic$.html"""") &&
+ files.get("WithPublic$.html") != None
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4374 - private") = {
+ val files = createTemplates("Trac4374.scala")
+ files("WithPrivate.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ ! s.contains("""href="WithPrivate$.html"""") &&
+ files.get("WithPrivate$.html") == None
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #3484") = {
+ val files = createTemplates("Trac3484.scala")
+
+ files("Collection.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ s.contains("""<span class="result">: Traversable[B]</span>""")
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #3484 - SR704") = {
+ val files = createTemplates("Trac3484.scala")
+
+ files("SR704.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ s.contains("Hello Mister John.")
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4325 - files") = {
+ val files = createTemplates("Trac4325.scala")
+
+ files.get("WithSynthetic.html") != None &&
+ files.get("WithSynthetic$.html") == None &&
+ files.get("WithObject.html") != None &&
+ files.get("WithObject$.html") != None
+ }
+
+ property("Trac #4325 - Don't link to syntetic companion") = {
+ val files = createTemplates("Trac4325.scala")
+
+ files("WithSynthetic.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ ! s.contains("""href="WithSynthetic$.html"""")
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4325 - Link to companion") = {
+ val files = createTemplates("Trac4325.scala")
+
+ files("WithObject.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ s.contains("""href="WithObject$.html"""")
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4420 - no whitespace at end of line") = {
+ val files = createTemplates("Trac4420.scala")
+
+ files("TestA.html") match {
+ case node: scala.xml.Node => {
+ val s = node.toString
+ s.contains("""See YYY for more details""")
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #484 - refinements and existentials") = {
+ val files = createTemplates("Trac484.scala")
+ val lines = """
+ |type Bar = AnyRef { type Dingus <: T forSome { type T <: String } }
+ |type Foo = AnyRef { ... /* 3 definitions in type refinement */ }
+ |def g (x: T forSome { type T <: String }): String
+ |def h (x: Float): AnyRef { def quux(x: Int,y: Int): Int }
+ |def hh (x: Float): AnyRef { def quux(x: Int,y: Int): Int }
+ |def j (x: Int): Bar
+ |def k (): AnyRef { type Dingus <: T forSome { type T <: String } }
+ """.stripMargin.trim.lines map (_.trim)
+
+ files("RefinementAndExistentials.html") match {
+ case node: scala.xml.Node => {
+ val s = node.text.replaceAll("\\s+", " ")
+ lines forall (s contains _)
+ }
+ case _ => false
+ }
+ }
+
+ property("Trac #4289") = {
+ val files = createTemplates("Trac4289.scala")
+
+ files("Subclass.html") match {
+ case node: scala.xml.Node => {
+ node.toString.contains {
+ """<dt>returns</dt><dd class="cmt"><p>123</p></dd>"""
}
}
case _ => false
}
}
+
+ property("Trac #4409") = {
+ createTemplate("Trac4409.scala") match {
+ case node: scala.xml.Node => {
+ ! node.toString.contains("""<div class="block"><ol>since""")
+ }
+ case _ => false
+ }
+ }
}
diff --git a/test/scaladoc/scala/model/CommentFactoryTest.scala b/test/scaladoc/scala/model/CommentFactoryTest.scala
index 25a91b1fa2..9f60d2a1b7 100644
--- a/test/scaladoc/scala/model/CommentFactoryTest.scala
+++ b/test/scaladoc/scala/model/CommentFactoryTest.scala
@@ -92,11 +92,9 @@ object Test extends Properties("CommentFactory") {
*
*/""",
Chain(List(Text(""), Text("\n"),
- HtmlTag("<pre>"), Text("\n"),
- Text("hello "), Chain(List(Text("^"),
- Chain(List(Text("world"),
- Text("\n"),
- HtmlTag("</pre>")))))))
+
+
+ HtmlTag("<pre>\nhello ^world\n</pre>")))
)
property("Trac #4366 - body") = {
@@ -109,8 +107,7 @@ object Test extends Properties("CommentFactory") {
)
body == Body(List(Paragraph(Chain(List(
- Summary(Chain(List(Chain(List(HtmlTag("<strong>"), HtmlTag("<code>foo</code>"), Text(" has been deprecated and will be removed in a future version"))), Text(".")))),
- Chain(List(Text(" Please call "), HtmlTag("<code>bar</code>"), Text(" instead."), HtmlTag("</strong>"), Text("\n"), Text("")))
+ Summary(Chain(List(HtmlTag("<strong><code>foo</code> has been deprecated and will be removed in a future version. Please call <code>bar</code> instead.</strong>"), Text("\n"), Text(""))))
)))))
}
@@ -122,7 +119,37 @@ object Test extends Properties("CommentFactory") {
*/
"""
)
+ body.summary == Some(Chain(List(HtmlTag("<strong><code>foo</code> has been deprecated and will be removed in a future version. Please call <code>bar</code> instead.</strong>"), Text("\n"), Text(""))))
+ }
- body.summary == Some(Chain(List(Chain(List(HtmlTag("<strong>"), HtmlTag("<code>foo</code>"), Text(" has been deprecated and will be removed in a future version"))), Text("."))))
+ property("Trac #4358 - body") = {
+ factory.createBody(
+ """
+ /**
+ * Implicit conversion that invokes the <code>expect</code> method on the <code>EasyMock</code> companion object (<em>i.e.</em>, the
+ * static <code>expect</code> method in Java class <code>org.easymock.EasyMock</code>).
+ */
+ """
+ ) match {
+ case Body(List(Paragraph(Chain(List(Summary(Chain(List(Chain(List(
+ Text("Implicit conversion that invokes the "),
+ HtmlTag("<code>expect</code>"),
+ Text(" method on the "),
+ HtmlTag("<code>EasyMock</code>"),
+ Text(" companion object ("),
+ HtmlTag("<em>i.e.</em>"),
+ Text(", the\nstatic "),
+ HtmlTag("<code>expect</code>"),
+ Text(" method in Java class "),
+ HtmlTag("<code>org.easymock.EasyMock</code>"),
+ Text(")")
+ )), Text(".")))), Text("\n")))))) =>
+ true
+ case other => {
+ println(other)
+ false
+ }
+ }
}
+
}
diff --git a/tools/get-git-svn-rev b/tools/get-git-svn-rev
deleted file mode 100755
index 685ce67a6d..0000000000
--- a/tools/get-git-svn-rev
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-#
-# Usage: get-scala-rev [dir]
-# Figures out current scala revision of an svn checkout or
-# a git-svn mirror (or a git clone.)
-#
-# If no dir is given, current working dir is used.
-
-DIR=""
-if [ $# -eq 0 ]; then
- DIR=`pwd`
-else
- DIR=$1
-fi
-
-cd $DIR
-
-if [ -d .svn ]; then
- svn info . | grep ^Revision | sed 's/Revision: //'
-elif [ -d .git ]; then
- GIT_PAGER=cat
- # this grabs more than one line because otherwise if you have local
- # commits which aren't in git-svn it won't see any revision.
- git log -10 | grep git-svn-id | head -1 | sed 's/[^@]*@\([0-9]*\).*/\1/'
-else
- echo "${DIR} doesn't appear to be git or svn dir." >&2
- echo 0
- exit 1
-fi
diff --git a/tools/get-scala-revision b/tools/get-scala-revision
index 685ce67a6d..4d6e67f79e 100755
--- a/tools/get-scala-revision
+++ b/tools/get-scala-revision
@@ -16,7 +16,8 @@ fi
cd $DIR
if [ -d .svn ]; then
- svn info . | grep ^Revision | sed 's/Revision: //'
+ # 2>&1 to catch also error output (e.g. svn warnings)
+ svn info . 2>&1 | grep ^Revision | sed 's/Revision: //'
elif [ -d .git ]; then
GIT_PAGER=cat
# this grabs more than one line because otherwise if you have local